Вызов функции для обновления моего интерфейса в фоновом режиме - PullRequest
0 голосов
/ 30 мая 2018

Я обнаружил, что если я включу этот код productPrice.setText(MyLeanCloudApp.getInstance().userTotalCharge.getPriceRangeString(product, context));, мой просмотр сетки не сможет плавно прокручиваться.

Класс ArrayAdapter

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View rowView = inflater.inflate(R.layout.searchcvc, parent, false);
    TextView productPrice = rowView.findViewById(R.id.SearchCVC_productPrice);

    // issue in here
    productPrice.setText(MyLeanCloudApp.getInstance().userTotalCharge.getPriceRangeString(product, context));

    return rowView;
}
  • MyLeanCloudApp - это класс, который расширяет Application

  • userTotalCharge - это переменнаякласс

Я пытался использовать Handler

Handler h = new Handler();
h.post(new Runnable() {
    @Override
    public void run() {
        productPrice.setText(MyLeanCloudApp.getInstance().userTotalCharge.getPriceRangeString(product, context));
    }
});

Но все еще не могу плавно прокрутить.Есть предложения?

1 Ответ

0 голосов
/ 30 мая 2018

Лучше всего использовать AsyncTask.

В фоновом режиме вы будете загружать изображения, а в пост-выполнении вы будете раздувать различные виды с изображениями, я использую этов моем проекте и прокрутка действительно плавная, как это происходит в фоновом режиме, когда я прокручиваю, он начнет заполнять представления

Посмотрите, я использую это для плавного заполнения изображений

private class CargarImg extends AsyncTask<Void, Void, Void> {
    private final int mPosition;
    private final MyViewHolder mHolder;
    private String mStringTexto;
    private Drawable mDrawableIcono;

    public CargarImg(int position, MyViewHolder holder) {
            mPosition = position;
            mHolder = holder;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            Bitmap mBitmap;
            try{
                mStringTexto = json.getNombre(mArrayData.get(mPosition));
                mDrawableIcono= json.getIcono(mArrayData.get(mPosition));
                mBitmap = ThumbnailUtils.extractThumbnail(((BitmapDrawable)mDrawableIcono).getBitmap(),150,150);
                mDrawableIcono = new BitmapDrawable(mContext.getResources(), mBitmap);
            }catch (Exception e){

                somethingHappened(mContext, "can't reach the photo");
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            mHolder.build(mStringTexto,mDrawableIcono);
            mHolder.imageView.setBackgroundColor(cargarColor(json.getTipo(mArrayData.get(mPosition))));


        }
    }

Как вы можете видеть, я загружаю изображения во время прокрутки, поэтому, поскольку я не загружаю их все сразу, он не замораживает поток пользовательского интерфейса, и вы можете прокручивать, и изображения будутзагрузка, это всего лишь подсказка для вас из моего кода, но я действительно предлагаю вам использовать AsyncTask.

А это мои bindViewHolder и viewHolder

@Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(mLayoutResourceId, parent, false);


        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        new CargarImg(position,holder).execute(); //here i execute the async to load the images smoothly

    }

Немногоподробнее:

public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView letterText;
        public ImageView imageView;

        private MyViewHolder(View view) {
            super(view);
            letterText =  view.findViewById(R.id.grid_text);
            imageView = view.findViewById(R.id.grid_image);
        }
        void build(String title, Drawable dr) {
            letterText.setText(title);
            imageView.setImageDrawable(dr);

        }
    }

Это в основном все адаптеры, необходимые для загрузки изображений.

...