当前位置: 首页 > 知识库问答 >
问题:

Android RecycerView:notifyDataSetChanged()IllegalStateException

徐德海
2023-03-14
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {

     //checkbox view listener
    viewHolder.getCheckbox().setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            //update list items
            notifyDataSetChanged();
        }
    });
}
java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
    at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:1462)
    at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:2982)
    at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:7493)
    at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:4338)
    at com.app.myapp.screens.RecycleAdapter.onRowSelect(RecycleAdapter.java:111)

我还使用了notifyItemChanged(),同样的异常。有什么秘密的更新方式来通知适配器有什么变化?

共有1个答案

宰父智敏
2023-03-14

您应该将方法'set OnCheckedChangeListener()'移动到ViewHolder,它是适配器上的内部类。

onbindviewholder()不是初始化viewholder的方法。此方法是刷新每个回收器项的步骤。当调用NotifyDataSetChanged()时,将调用onbindviewholder()作为每个项的次数。

因此,如果将NotifyDataSetChanged()放入oncheckChanged()并在onbindviewholder()中初始化复选框,则由于循环方法调用,将获得IllegalStateException。

单击复选框->onCheckedChanged()->notifyDataSetChanged()->onBindViewHolder()->设置复选框->OnChecked······

简单地说,您可以通过将一个标志放入适配器来解决这个问题。

试试这个,

private boolean onBind;

public ViewHolder(View itemView) {
    super(itemView);
    mCheckBox = (CheckBox) itemView.findViewById(R.id.checkboxId);
    mCheckBox.setOnCheckChangeListener(this);
}

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if(!onBind) {
        // your process when checkBox changed
        // ...

        notifyDataSetChanged();
    }
}

...

@Override
public void onBindViewHolder(YourAdapter.ViewHolder viewHolder, int position) {
    // process other views 
    // ...

    onBind = true;
    viewHolder.mCheckBox.setChecked(trueOrFalse);
    onBind = false;
}
 类似资料:
  • 问题内容: 我刚遇到JavaFX和Swing的怪异之处。 处置已添加到JFrame或JPanel的JavaFX Panel时,重新添加新的JFXPanel将引发IllegalStateException:“已调用Platform.exit”。 就我而言,这是在我删除了一些内部带有JFXPanels的JPanels,然后尝试重新添加它们之后发生的。 问题答案: 幸运的是,我在Oracle论坛上找到了

  • 问题内容: 我有一个文件,其中包含以下格式的数据 我想将此加载为 这是Java 8代码, 我收到以下错误 如何解决此错误? 问题答案: 如果文件中没有重复代码,则代码将运行。 如果有重复项,请使用以下代码获取该键在文件中的出现总数。

  • 问题内容: 我是JSF的新手,正在构建使用Facelets创建的应用程序。 这是我的模板 master.xhtml MasterSearch.xhtml MasterSearch.java这是一个bean faces-config.xml 现在,当我运行此代码(实际上是masterp.xhtml)时,它显示出完美的输出并加载了Accuratley,但它在控制台中引发了异常,即 而且我认为由于这个原

  • 问题内容: 我正在尝试使用以下Fastload API 连接…等是完美的。 我确切知道失败的地方 例外是 这是我要上传的表格。这是一种格式,当我通过记事本打开它时,它看起来像这样 为什么会出现此异常?我该如何改善?据我了解,问题是不以某种方式接受数据集并引发异常 问题答案: 通常,用于表示“方法已在非法或不适当的时间被调用”。但是,这看起来并不特别典型。 您链接到的代码表明,可以在第259行的 代

  • 问题内容: 一段时间以来,我一直在努力解决此错误,而且我不知道问题出在哪里。我的代码是这样的: 它在remove调用上引发IllegalStateException。 我一直在想问题是否会出现,因为我要删除列表的最后一项,但即使在过程的中间,它似乎也会出错。 你们能给我一个解释吗? 问题答案: 您正在从内部循环内部的列表中删除一个元素。这意味着您的内部循环可能会尝试两次删除相同的元素,这将解释您遇

  • 问题内容: 从cancel方法的文档中: (松散地说,如果此方法阻止执行一个或多个计划的执行,则返回true。) 当我执行此代码时: 出乎意料的是,调试语句将输出: 这表明取消应该完成。但是,当我重新获得窗口焦点(并尝试重新安排计时器)时,应用程序因以下错误而崩溃: 我不知道如何解决此问题,并且我已经浏览了其他类似的问题,但没有任何效果。有任何想法吗? 问题答案: 您 不能 重复使用timerta

  • 问题内容: 我正在尝试使用Stream API生成Order实例。我有一个创建订单的工厂函数,并且使用DoubleStream初始化订单金额。 如果我使用文字(1.0)初始化Order实例,则可以正常工作。当我使用doubleStream创建随机数量时,将引发异常。 问题答案: 答案在(重点是我的)的javadoc中: 流仅应操作一次(调用中间流或终端流操作) 。例如,这排除了“分叉”流,其中相同

  • 问题内容: 我使用Java中的正则表达式来捕获组,即使我知道表达式匹配,它也会不断抛出一个。 这是我的代码: 我期待是因为在正则表达式的捕获组拍摄的,而是我得到: IllegalStateException:找不到匹配项 我也尝试过,但发生相同的错误。 根据该文件,并: 捕获组从左到右从一个索引开始。零组表示整个模式,因此表达式等于。 我究竟做错了什么? 问题答案: 是帮助程序类,它处理数据迭代以