recyclerview notifyDataSetChanged() 不工作

recyclerview notifyDataSetChanged() is not working

我正在尝试使用 updateList() 中的 notifyDataSetchanged() 来更新我的适配器。但不适用于 recyclerview。我可以在 updateList() 中看到列表大小及其显示的实际结果,但只有 reclerview 不是 updating.This class 是在 MVVM 设计模式中设计的。

   public class TasksAdapter extends RecyclerView.Adapter<TasksAdapter.TasksAdapterViewHolder> {
        private static final String TAG =  TasksAdapter.class.getSimpleName();
        static ArrayList<ItemModel> list;
        static Context mContext;
        private Fragment fragment;
        private int row_index = -1;
        private SessionManager session;
    //    SelectColorVM colorVM;

        public TasksAdapter(Fragment fragment, Context context, ArrayList<ItemModel> itemList) {
            this.mContext = context;
            this.list = itemList;
            this.fragment = fragment;
            session = new SessionManager(fragment.getContext());
        }

        public void updateList(ArrayList<ItemModel> itemList){
            list.clear();
            this.list = itemList;
            notifyDataSetChanged();
        }

        @Override
        public TasksAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            TasksItemBinding binding =
                    DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.tasks_item,
                            parent, false);
            return new TasksAdapter.TasksAdapterViewHolder(binding);
        }

        @Override
        public void onBindViewHolder(TasksAdapterViewHolder holder, final int position) {
            holder.binding.setViewModel(list.get(position));
            if(position == 0 && list.get(position).btnText.get().toString().length() > 0)
                holder.binding.btnUpdate.setVisibility(View.VISIBLE);
            else
                holder.binding.btnUpdate.setVisibility(View.INVISIBLE);
            holder.binding.layoutItem.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    //                row_index = position;
    //                notifyDataSetChanged();
                    Fragment fragment = new DetailFragment();
                    FragmentManager manager = ((FragmentActivity) mContext).getSupportFragmentManager();
                    FragmentTransaction fragmentTransaction = manager.beginTransaction();
                    Bundle bundle = new Bundle();
                    ItemModel item = list.get(position);
                    bundle.putSerializable("item", item);
                    fragment.setArguments(bundle);
                    fragmentTransaction.replace(R.id.id_frame, fragment, "details");
                    fragmentTransaction.addToBackStack("details");
                    fragmentTransaction.commit();
                }
            });
            holder.binding.btnUpdate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    HashMap<String, String> user = session.getUserDetails();
                    if(list.get(position).btnText.get().equals("Task Start")){
                        LandingEngine.updateStatusAndSetStartTimeForRequest(fragment, user.get(SessionManager.KEY_CLEANER_ID), list.get(position).sid.get().toString());
                    } else if(list.get(position).btnText.get().equals("Task Complete")){
                        LandingEngine.updateStatusAndSetCompleteTimeForRequest(fragment, user.get(SessionManager.KEY_CLEANER_ID), list.get(position).sid.get().toString());
                    }
                }
            });
        }

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

        public static class TasksAdapterViewHolder extends RecyclerView.ViewHolder {
            TasksItemBinding binding;

            public TasksAdapterViewHolder(TasksItemBinding rowbinding) {
                super(rowbinding.getRoot());
                this.binding = rowbinding;
            }

        }
        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public int getItemViewType(int position) {
            return position;
        }


    }

我正在从我的片段调用适配器,如下所示

if(list.size() > 0) {
            if(adapter == null) {
                view.setHasFixedSize(true);
                mLayoutManager = new LinearLayoutManager(fragment.getContext());
                view.setLayoutManager(mLayoutManager);
                adapter = new TasksAdapter(fragment, fragment.getContext(), list);
                view.setAdapter(adapter);
                view.addItemDecoration(new DividerItemDecoration(fragment.getContext()));
            } else {
                adapter.updateList(list);
//                view.getAdapter().notifyDataSetChanged();
//                view.invalidate();
            }
        }

请检查一下,让我知道我做错了什么地方here.Thanks提前..

不要

 public void updateList(ArrayList<ItemModel> itemList)
        {
            list.clear();
            this.list = itemList;
            notifyDataSetChanged();
        }
  • 每当调用此方法时list.clear();清除所有值。

The clear() method is used to remove all of the elements from a list.

DO

 public void updateList(ArrayList<ItemModel> itemList)
            {
               this.list.addAll(itemList);
               notifyDataSetChanged();
            }

尝试将 list.clear(); 从您的 updateList 方法中删除

public void updateList(ArrayList<ItemModel> itemList){

            this.list.addAll(itemList);
            notifyItemInserted(list.size());
            notifyDataSetChanged();
        }

notifyItemInserted(int position)

Notify any registered observers that the item reflected at position has been newly inserted.

也试试这个

        list.addAll(your new list);

        if (adapter == null) {
            view.setHasFixedSize(true);
            mLayoutManager = new LinearLayoutManager(fragment.getContext());
            view.setLayoutManager(mLayoutManager);
            adapter = new TasksAdapter(fragment, fragment.getContext(), list);
            view.setAdapter(adapter);
            view.addItemDecoration(new DividerItemDecoration(fragment.getContext()));
        } else {


            view.notifyItemInserted(list.size());
            view.notifyDataSetChanged();
        }

尝试在您的 Fragment class 中添加 notifyDataSetChanged(),例如...

adapter.notifyDataSetChanged();

我遇到了同样的问题,你在这方面做错了,将列表更改为itemList:

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

试试这个

    getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                       view.adapter.notifyDataSetChanged();
                }
            });

一旦从 volley 库获得 API 响应,它最终通过从片段 class 调用此方法来工作。

我在 ViewModel 中编写了以下方法 class。

public void updateList(ArrayList<Class> list){
        if(adapter != null) {
            adapter.updateList(list);
        }
    }

然后从片段 class 调用此方法,如下所示。

ArrayList<StatisticsModel> list = (ArrayList) data;
        viewModel.updateList(list);

因此在适配器中 class 更新方法如下。

public void updateList(ArrayList<StatisticsModel> itemList){
        list.clear();
//        this.list = itemList;
//        list.addAll(itemList);
//        notifyItemInserted(list.size());
//        notifyDataSetChanged();
        this.list.addAll(itemList);
//        notifyItemInserted(list.size());
        notifyDataSetChanged();
    }

有同样的问题。就我而言,logcat RecyclerView 中出现错误消息:未附加布局管理器;跳过布局

我已经用下面的代码修复了

    LinearLayoutManager llm = new LinearLayoutManager(this.getActivity());
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    mRecyclerView.setLayoutManager(llm);

然后 notifyDataSetChanged 开始工作