@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(),同样的异常。有什么秘密的更新方式来通知适配器有什么变化?
您应该将方法'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:找不到匹配项 我也尝试过,但发生相同的错误。 根据该文件,并: 捕获组从左到右从一个索引开始。零组表示整个模式,因此表达式等于。 我究竟做错了什么? 问题答案: 是帮助程序类,它处理数据迭代以