【转载】Android RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid item positio

转载自:Drakeet的我的博客java

RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid item position

今早我更新了 Android Studio 1.2 Preview 和 22 版本的 sdk,包括兼容库也更新到 22.0.0,可是使人失望的是,RecyclerView 存在的一个明显的 bug 仍然没有修复:android

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position…ide

重现的方法是:使用 RecyclerView 加官方下拉刷新的时候,若是绑定的 List 对象在更新数据以前进行了 clear,而这时用户紧接着迅速上滑 RV,就会形成崩溃,并且异常不会报到你的代码上,属于RV内部错误。初次猜想是,当你 clear 了 list 以后,这时迅速上滑,而新数据还没到来,致使 RV 要更新加载下面的 Item 时候,找不到数据源了,形成 crash.google

但明显,更新数据以前 clear list 是挺常见的作法,你不可能祈祷用户这时候乖乖不动等待新数据加载完,因此根本就是不合理的。spa

嗯,Google 有时真是使人很是失望。好在我想到了解决这个问题的方法。
code

就是在刷新,也就是 clear 的同时,让 RecyclerView 暂时不可以滑动,以后再容许滑动便可。代码就是在 RecyclerView 初始化的时候加上是否在刷新进而拦截手势:对象

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

而后去改变和恢复 mIsRefreshing 这个 boolean 便可。想象中以为若是不让用户滑动很愚蠢,但不得不这么作的时候,发现真实效果很算完美,很不错的!我想基本上使用 RecyclerView 都会遇到这个问题,因此将它整理发表出来,一块儿绕过这个坑吧。blog

相关文章
相关标签/搜索