【问题标题】:check multiple check box in RecyclerView listview but refresh list using notifyDataSetChanged that is not work properly [duplicate]检查 RecyclerView 列表视图中的多个复选框,但使用无法正常工作的 notifyDataSetChanged 刷新列表 [重复]
【发布时间】:2019-09-05 06:39:41
【问题描述】:

点击列表

  phonebooster.get(position).setSelected(isChecked);
            ArrayList<CacheDataModel> cacheDataModels=new ArrayList<>();
            cacheDataModels.addAll(phonebooster);
            phonebooster.clear();
            phonebooster.addAll(cacheDataModels);
            notifyDataSetChanged();

查看错误

 java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling android.support.v7.widget.RecyclerView{fdff32c VFED..... ......ID 0,86-720,508 #7f080126 app:id/recyclerView}, adapter:com.example.cleanerandroid.adapter.AppAdapter@e7a21f5, layout:android.support.v7.widget.LinearLayoutManager@8d74b8a, context:com.example.cleanerandroid.activity.PhoneBooster@68f63c3
    at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2880)
    at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:5281)
    at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:11997)
    at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:7070)
    at com.example.cleanerandroid.adapter.AppAdapter$1$1.run(AppAdapter.java:67)
    at android.app.Activity.runOnUiThread(Activity.java:6406)
    at com.example.cleanerandroid.adapter.AppAdapter$1.onCheckedChanged(AppAdapter.java:64)
    at android.widget.CompoundButton.setChecked(CompoundButton.java:182)
    at com.example.cleanerandroid.adapter.AppAdapter.onBindViewHolder(AppAdapter.java:75)
    at com.example.cleanerandroid.adapter.AppAdapter.onBindViewHolder(AppAdapter.java: 32)

我在 recycleview 中有复选框,每当我尝试检查多个复选框(请参阅下面的代码)时,它都会给我错误(请参阅错误日志)。

【问题讨论】:

  • 你不能在 onBindViewHolder() 中调用 notifyDataSetChanged();,这就是你得到 IllegalStateException 的原因。从 Fragment/Activity 调用 adapter.notifyDataSetChanged();

标签: java android boost


【解决方案1】:

试试这个

holder.mLinearParent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (List.get(position).isSelected()) {
                List.get(position).setSelected(false);
            } else {
                List.get(position).setSelected(true);
            }
            notifyDataSetChanged();
        }
    });

【讨论】:

  • 如果你从onBindViewHolder()调用它会抛出同样的异常
  • 把 holder.mLinearParent.setTag(position);以上 setOnClickListener.
  • 我不是要求澄清,我是说您的回答无效。 OP 在onBindViewHolder() 内调用onBindViewHolder(),这就是他们得到IllegalStateException 的原因。但你提出了一个完全不相关的答案。
  • 它工作得很好,谢谢。 @AuxanoServices
猜你喜欢
  • 2013-04-21
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
相关资源
最近更新 更多