最近在做一个项目的时候,是一个加上checkbox的recyclerview,然后选中状态或者取消时候有相应的效果产生,然后有button用于增加或者减少item的个数,然后发现点击过快或者有些时候会出现这样一个错误
IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
表示不能在加载布局还未完成时候使用这个方法,定位在了这个方法上面
public void setDefItem(int position){
lightIndex = position;
notifyDataSetChanged();
}
,后来在网上查阅,说是在isComputingLayout()
方法为true的时候就会抛出这个异常,然后判断这个方法的返回值如果是true就使用post去刷新这个界面
if (recyclerView.isComputingLayout()) {
recyclerView.post(new Runnable() {
@Override
public void run() {
mAdapter.setDefItem(position);
}
});
} else {
mAdapter.setDefItem(position);
}
参考链接http://www.manongjc.com/article/50422.html
但是后来仔细看我自己的代码发现之前在写这里的时候对checkbox的绑定时忘记对这个触发事件进行判断,所以在加载时候会不断地去刷新这个界面而且导致选中的框很容易出现错乱
holder.mCheckAble.setChecked(info.isChecked());
holder.mCheckAble.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mItemClick.checkedChange(position,isChecked);
}
});
因为setchecked()方法在每一次调用的时候都会去执行一次这个切换的点击事件,但是我真是想要的只是观察用户的点击切换,所以使用isPressed();方法去做一次判断,是否是用户点击的而不是setchecked()方法,
holder.mCheckAble.setChecked(info.isChecked());
holder.mCheckAble.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(buttonView.isPressed()){
mItemClick.checkedChange(position,isChecked);
}
}
});
然后修改了这个地方之后我又去对post方法进行了log打印,发现这时已经不会在使用到post方法里面的刷新了,不过为了防止特殊情况的发生,这里还是对这个方法进行了保留