IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling

喜欢ヅ旅行 2021-09-07 06:09 430阅读 0赞

当正在滑动过程中调用notifyDataSetChanged刷新数据就会出现这个异常:

  1. 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
  2. at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2769)
  3. at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:5177)

原因:RecyclerView不允许计算布局过程中调用刷新方法。

解决方法1:递归等到可以修改后再修改:

  1. /**
  2. * 递归等待滑动停止后再删除数据
  3. *
  4. * @param deleteData 不建议使用position,因为如果出现多个等待position将会出错
  5. */
  6. public void waitDelete(final XXData deleteData) {
  7. if (mRv.isComputingLayout()) {
  8. mRv.postDelayed(new Runnable() {
  9. @Override
  10. public void run() {
  11. waitDelete(deleteData);
  12. }
  13. }, 100);
  14. } else {
  15. mAdapter.getList().remove(deleteData);
  16. mAdapter.notifyDataSetChanged();
  17. }
  18. }

解决方法2:强制停止滑动(有点突兀),然后刷新数据:

  1. /**
  2. * 强制停止滑动,然后刷新数据
  3. *
  4. * @param deleteData 不建议使用position,因为如果出现多个等待position将会出错
  5. */
  6. public void waitDelete(final Long deleteData) {
  7. //强制停止
  8. mRv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL, 0, 0, 0));
  9. mRv.postDelayed(new Runnable() {
  10. @Override
  11. public void run() {
  12. mAdapter.getList().remove(deleteData);
  13. mAdapter.notifyDataSetChanged();
  14. }
  15. }, 100);
  16. }

解决方法3:当然也可以监听rv的scroll事件,由于复杂且某些情况不适用,所以就不写了

发表评论

表情:
评论列表 (有 0 条评论,430人围观)

还没有评论,来说两句吧...

相关阅读