滑動RecyclerView時出現異常: java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 6(offset:6).state:30


RecyclerView 存在的一個明顯的 bug 一直沒有修復:

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

重現的方法是:使用 RecyclerView 加官方下拉刷新的時候,如果綁定的 List 對象在更新數據之前進行了 clear,而這時用戶緊接着迅速上滑 RV,就會造成崩潰,而且異常不會報到你的代碼上,屬於RV內部錯誤。初次猜測是,當你 clear 了 list 之后,這時迅速上滑,而新數據還沒到來,導致 RV 要更新加載下面的 Item 時候,找不到數據源了,造成 crash.

但明顯,更新數據之前 clear list 是挺常見的做法,你不可能祈禱用戶這時候乖乖不動等待新數據加載完,所以根本就是不合理的。

嗯,Google 有時真是令人非常失望。好在我想到了解決這個問題的方法。

就是在刷新,也就是 clear 的同時,讓 RecyclerView 暫時不能夠滑動,之后再允許滑動即可。代碼就是在 RecyclerView 初始化的時候加上是否在刷新進而攔截手勢:

1
2
3
4
5
6
7
8
9
10
11
12
mRecyclerView.setOnTouchListener(
         new View.OnTouchListener() {
             @Override
             public boolean onTouch(View v, MotionEvent event) {
                 if (mIsRefreshing) {
                     return true ;
                 } else {
                     return false ;
                 }
             }
         }
);

然后去改變和恢復 mIsRefreshing 這個 boolean 即可。想象中覺得如果不讓用戶滑動很愚蠢,但不得不這么做的時候,發現真實效果很算完美,很不錯的!我想基本上使用 RecyclerView 都會遇到這個問題,所以將它整理發表出來,一起繞過這個坑吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM