當 RecyclerView讓Google 工程師背了鍋
在座(站)的各位,一定在 RecyclerView 的使用中遇到過這樣的 bug 吧,且看日誌。
數組越界?NoNoNo。整篇日誌,均沒有涉及到我們的代碼,一時讓人也摸不著頭腦,經過一番查閱資料才發現,論壇上早已炸鍋。該 bug 竟然是 Google 程序員的鍋?
從 StackOverFlow 相關資料得知,該 Bug 主要是由於 Adapter 綁定的集合和 RecyclerView 的數據不一致而導致。
直接說解決思路
找到了癥結,問題解決解決起來也是非常簡單,且聽我細細到來。
直接採用同步外部數據集和內部數據集。[ 不是很推薦 ]
use notifyDataSetChanged() will avoid this crash, but it will kill Animation and Performance.
該方法比較簡單,但失去了動畫效果,而且更新數據的性能較低。另外,如果對外部數據集做了兩次以上的操作,卻只調用 `notifyDataSetChanged` 同步一次,也極有可能報上述錯誤。
直接 Try 住這個 Bug【最簡單粗暴】
直接複寫 LinearLauoutManager。
對,沒錯,直接更換 LayoutManaer 就 OK 了
順藤摸瓜,做最優雅的程序員
既然我們知道了崩潰發送原因,我們可以直接順藤摸瓜。在進行數據移除和數據增加的時候,保證 RecyclerView 的 Adapter 中的數據集移除和添加等操作後的數據集保持一致。
RecyclerView 內部的數據集這裡我們不妨叫「內部數據集」,而我們傳遞給 Adapter 的,姑且叫它 「外部數據集」。我們通過「外部數據集」更新「內部數據集」,一般會使用到以下的方法。
我們一般不採用 `notifyDataSetChanged()` 方法,因為它不但沒有默認的動畫效果,而且在更新數據的效率上會大打折扣,官方並不推薦。
我們一般在給 Adapter 設置數據時會這樣做。
實際上這段代碼,並無毛病,但假設 data 數據為介面返回的數據,刷新後返回的數據和現在 Adapter 中的數據數目不一致的時候,極有可能出現開題的 bug,直接崩潰。所以我們不妨可以這樣修復。
自此完畢。各位看官不妨一試。
TAG:nanchen |