簡體   English   中英

recyclerview notifyDataSetChanged() 不工作

[英]recyclerview notifyDataSetChanged() is not working

我正在嘗試使用 updateList() 中的 notifyDataSetchanged() 更新 myadapter。但不適用於 recyclerview。 我可以在 updateList() 中看到列表大小及其顯示的實際結果,但只有 reclerview 沒有更新。這個 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();
            }
        }

請檢查一下,讓我知道我哪里做錯了。在此先感謝..

最后,一旦從 volley 庫中獲得 API 響應,它就會通過從片段類調用此方法來工作。

我在 ViewModel 類中編寫了以下方法。

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

並從片段類調用此方法,如下所示。

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

所以在適配器類中更新方法如下。

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();
    }

不要

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

clear() 方法用於從列表中刪除所有元素。

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

我遇到了同樣的問題,你在這方面做錯了,將列表更改為 itemList:

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

試試這個

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

試試這個刪除list.clear(); 來自您的updateList方法

public void updateList(ArrayList<ItemModel> itemList){

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

notifyItemInserted(int position)

通知任何注冊的觀察者在位置反射的項目已被新插入。

也試試這個

        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類中添加notifyDataSetChanged() ,例如...

adapter.notifyDataSetChanged();

有同樣的問題。 就我而言,logcat RecyclerView 中有錯誤消息:沒有附加布局管理器; 跳過布局

我已經用以下代碼修復了

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

然后 notifyDataSetChanged 開始工作

我不知道為什么有時我們不創建適配器的兩個實例,而且我們在主線程適配器上。notifyDataSetChanged() 不工作在這種情況下,只需從適配器 class 調用 notifyDataSetChanged() 方法。

adapter.setNewValue(newlist)

在 AdapterClass 上

fun setNewValue(newlist:ArrayList<Any>) {
list = newlist
notifyDataSetChanged()  
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM