Swipe Refre sh Просмотр анимации застрял из-за setAdapter в Android - PullRequest
0 голосов
/ 29 апреля 2020

У меня Recycleview с функцией pull to refre sh и выполнением pull для refre sh Я перетасовываю записи в Recycleview

Теперь у меня проблема, когда я устанавливаю новый массив в Recycleview с помощью используя pull для обновления sh вида. Здесь представление Swipe Refre sh застревает, фактически, весь Recycleview застревает из-за метода notifyDataSetChange (), эта проблема существует только в течение 1 или 2 секунд. Кроме того, мое количество записей - это массив порядка 200, так что, возможно, это также имеет место.

К вашему сведению: я могу добавить индикатор выполнения для этой задачи, но я не хочу блокировать взаимодействие с пользователем Таким образом, любая помощь, которую я могу установить адаптер без каких-либо задержек / застревания в пользовательском интерфейсе?

Адаптер

public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.MyViewHolder> implements View.OnClickListener {
    public Context context;
    List<Model.Result> list;
    Controller controller;
    CommonFunctions cmf;
    String user_id;
    int layout;
    ImageLoader imageLoader;
    private DisplayImageOptions options;

    public BaseAdapter(Context context, List<Model.Result> list, int layout, Controller controller) {
        this.context = context;
        this.list = list;
        this.controller = controller;
        this.layout = layout;
        imageLoader = ImageLoader.getInstance(); // Get singleton instance
        options = new DisplayImageOptions.Builder()
            .showImageOnLoading(R.drawable.placeholder_ic)
            .showImageOnFail(R.drawable.placeholder_ic)
            .cacheInMemory(true)
            .cacheOnDisk(true)
            .build();
        cmf = new CommonFunctions(context);
        user_id = CommonFunctions.myPreference.getString(context, GlobalConstants.id);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(layout, parent, false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

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

        // holder.name.setText(list.get(pos).getCatName());
        if (holder.name != null)
            holder.name.setText(list.get(pos).getAudioName());
        if (holder.title != null)
            holder.title.setText(list.get(pos).getArtistName());
        if (holder.timeDuration != null)
            holder.timeDuration.setText(list.get(pos).getAudiolength());
        if(holder.txtTopicName!=null)
            holder.txtTopicName.setText(list.get(pos).getCatName());

        if (holder.image != null) {
          imageLoader.displayImage(list.get(pos).getAudioImage(), holder.image,options);
        }
    }


    @Override
    public int getItemCount() {
        return list.size();
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.TV_title) {

        }
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        LinearLayout ll_row;
        ImageView iv_more, image;
        TextView name, title, timeDuration,txtTopicName;

        public MyViewHolder(View itemView) {
            super(itemView);
            ll_row = itemView.findViewById(R.id.ll_row);
            iv_more = itemView.findViewById(R.id.iv_more);
            image = itemView.findViewById(R.id.image);
            name = itemView.findViewById(R.id.name);
            title = itemView.findViewById(R.id.title);
            timeDuration = itemView.findViewById(R.id.time_duration);
            txtTopicName = itemView.findViewById(R.id.txtTopicName);
        }
    }


}

Refre sh Просмотр

binding.swipeLayout.setOnRefreshListener(() -> {
            binding.swipeLayout.setRefreshing(false);
            if(array!=null&&array.size()>0){
                Collections.shuffle(array, new Random());
                binding.recyclerView.setAdapter(new BaseAdapter(getActivity(),array, layout,null));
            }
        });

1 Ответ

0 голосов
/ 29 апреля 2020

Я не работал в привязке вида, но вижу под линией, виновник.

   binding.recyclerView.setAdapter(new BaseAdapter(getActivity(),array, layout,null));

// что тяжелая операция по созданию конструктора и, наконец, взгляд на ваш класс адаптера, насколько тяжелый. Ваш конструктор базового адаптера кажется тяжелым,

  imageLoader = ImageLoader.getInstance(); // Get singleton instance
  options = new DisplayImageOptions.Builder() // heavy
            .showImageOnLoading(R.drawable.placeholder_ic)
            .showImageOnFail(R.drawable.placeholder_ic)
            .cacheInMemory(true)
            .cacheOnDisk(true)
            .build();

Я бы предложил + Далее при создании вашего адаптера пропустите пустой список.

  • Почему бы вам не инициализировать Экземпляр DisplayImageOptions в классе Host, в котором вы создаете адаптер и передаете инициализированный экземпляр адаптеру.
  • таким образом накладные расходы принимаются на классе хоста, а не на адаптере.

  • и последнее, когда выполняется свайп, готов новый новый.

    mAdapter.setNewList (любой список) {this.yourList = newList; notifyDataSetChanged. }

Это должно сделать работу

...