【轉載】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

相關文章
相關標籤/搜索