RecyclerView 存在的一個明顯的 bug 一直沒有修復:
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position…
重現的方法是:使用 RecyclerView 加官方下拉刷新的時候,如果綁定的 List 對象在更新數據之前進行了 clear,而這時用戶緊接着迅速上滑 RV,就會造成崩潰,而且異常不會報到你的代碼上,屬於RV內部錯誤。初次猜測是,當你 clear 了 list 之后,這時迅速上滑,而新數據還沒到來,導致 RV 要更新加載下面的 Item 時候,找不到數據源了,造成 crash.
但明顯,更新數據之前 clear list 是挺常見的做法,你不可能祈禱用戶這時候乖乖不動等待新數據加載完,所以根本就是不合理的。
- Stack Overflow 上也有這個問題,未能夠解決:
How to change contents of RecyclerView while scrolling - Google code 論壇上也有這個 issue,一堆跟帖,都是描述如何重現,未能夠解決:
https://code.google.com/p/android/issues/detail?id=77846
嗯,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 都會遇到這個問題,所以將它整理發表出來,一起繞過這個坑吧。
