这个异常出现在在onBindViewHolder方法里调用notifyDataSetChanged刷新的时候。
stackoverflow里也给出了解释:
onBindViewHolder方法不是用来初始化viewholder的,这个方法是用来刷新每一个recycler item的。所以在onBindViewHolder里的某些组件里的事件方法做notifyDataSetChanged,onBindViewHolder就会频繁执行
解决方法很简单,就是将这些事件方法从onBindViewHolder分离出来。具体代码,stackoverflow
还要一种解决方式,就是通过延时handler来解决该异常。从Recyclerview的源码注释中我们可以找到答案
当recyclerview正在计算layout的时候,任何视图更新adapter内容的操作都会导致异常。而当view在layout正在计算过程中的一些回调,我们可以通过handler或者其他类似机制延后这些改变。so,这就是我们以上解决办法的来源。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
UIUtils.showToastSafe(ShowItemsActivity.this, "loading...");
list.add("");
adapter.notifyDataSetChanged();
}
}, 1000);