IndexOutOfBoundsException: Inconsistency detected. Invalid item position

来源:互联网 发布:c 游戏编程 编辑:程序博客网 时间:2024/05/20 22:30

做项目遇到个问题:使用RecyclerView + SwipeRefreshLayout时,下拉刷新,接着连续快速上拉。
程序直接奔溃! 接着一脸懵逼。。
查看日志看到报错IndexOutOfBoundsException: Inconsistency detected. Invalid item position
并且错误并没有报到自己代码中,是在RecycleView 中崩溃的。

原因:

list.clear()之后,这时迅速上滑list为空,导致RecyclerView要加载数据的时候,找不到数据源了,造成crash

解决办法:

更新,加载数据时,禁止滑动

设置全局变量mIsRefreshing

boolean mIsRefreshing = false;

RecyclerView设置OnTouchListener

mRecyclerView.setOnTouchListener(        new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                return mIsRefreshing;            }        });

原理就是:设置TouchListener,通过设置mIsRefreshing的值当请求数据时(下拉刷新,上拉加载)并返回trueRecyclerView将无法滑动,无法点击里面的Item。即无法回调OnScrollListenerOnItemClickListener方法。请求结束后返回false,正常回调OnScrollListenerOnItemClickListener方法。

还有一个更简单的办法:

list.clear();之后notify一下。有一个缺点就是会闪一下。

1 0
原创粉丝点击