當前位置:
首頁 > 最新 > 當 RecyclerView讓Google 工程師背了鍋

當 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,直接崩潰。所以我們不妨可以這樣修復。

自此完畢。各位看官不妨一試。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 nanchen 的精彩文章:

TAG:nanchen |