今早我更新了 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
- Stack Overflow 上也有這個問題,未可以解決:
How to change contents of RecyclerView while scrolling - Google code 論壇上也有這個 issue,一堆跟帖,都是描述如何重現,未可以解決:
https://code.google.com/p/android/issues/detail?id=77846
嗯,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