IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
当正在滑动过程中调用notifyDataSetChanged刷新数据就会出现这个异常:
java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling android.support.v7.widget.RecyclerView{d510381 VFED..... .F...... 0,0-1080,1731 #7f08007d app:id/rv_1s}, adapter:com.wang.daojishi.Example1sActivity$1@155fc26, layout:android.support.v7.widget.GridLayoutManager@fd42067, context:com.wang.daojishi.Example1sActivity@dca765c
at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2769)
at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:5177)
原因:RecyclerView不允许计算布局过程中调用刷新方法。
解决方法1:递归等到可以修改后再修改:
/**
* 递归等待滑动停止后再删除数据
*
* @param deleteData 不建议使用position,因为如果出现多个等待position将会出错
*/
public void waitDelete(final XXData deleteData) {
if (mRv.isComputingLayout()) {
mRv.postDelayed(new Runnable() {
@Override
public void run() {
waitDelete(deleteData);
}
}, 100);
} else {
mAdapter.getList().remove(deleteData);
mAdapter.notifyDataSetChanged();
}
}
解决方法2:强制停止滑动(有点突兀),然后刷新数据:
/**
* 强制停止滑动,然后刷新数据
*
* @param deleteData 不建议使用position,因为如果出现多个等待position将会出错
*/
public void waitDelete(final Long deleteData) {
//强制停止
mRv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL, 0, 0, 0));
mRv.postDelayed(new Runnable() {
@Override
public void run() {
mAdapter.getList().remove(deleteData);
mAdapter.notifyDataSetChanged();
}
}, 100);
}
解决方法3:当然也可以监听rv的scroll事件,由于复杂且某些情况不适用,所以就不写了
还没有评论,来说两句吧...