1. 程式人生 > >RecyclerView區域性重新整理的應用場景簡單分析

RecyclerView區域性重新整理的應用場景簡單分析

RecyclerView 區域性重新整理的應用場景鞏固

今天在做通訊錄遮蔽時,由於通訊錄列表裡有兩種不同的效果展示:

1. 已經遮蔽的 item ,顯示一個按鈕“解除遮蔽”
2. 未遮蔽的 item ,顯示兩個按鈕“恢復遮蔽”和“邀請”

分析到這裡後,果斷在 adapter 裡建立了兩種 type 來分別處理兩種不一樣的顯示效果,事實證明這也確實能滿足這個需求。
然而當我把測試資料新增到2000條時,越往列表底部,當處理點選按鈕切換 item 的 type 時, ui 重新整理的就越慢。
分析了一下,大致知道了是怎麼回事:

RecyclerView 的區域性重新整理 notifyItemRangeChanged(int positionStart, int itemCount) ,它是當 adapter 繫結的資料來源發生變化後,
把變化的資料重新整理到 原typeview 上去。
也就是說,我之前的寫法,使用區域性重新整理去改變typeview,這種用法是不對的。

NotifyItemRangeChanged官方解釋

google官方解釋,大概意思是

“這是一個 item 改變事件,而不是結構改變事件。它表明,在給定的位置範圍內的資料的任何反射都是失效的並且應該更新。這些在給定範圍的 item 具有相同的標識(即它們的資料都已經失效並需要更新)。”

recyclerview的區域性重新整理是有區分的,有資料的重新整理和 item 結構的重新整理,區域性的 item 插入、刪除、移動重新整理方法都是結構的重新整理。而notifyItemChanged、notifyItemRangeChanged方法屬於資料的重新整理。

解決方法:

把之前的兩種typeview合併成一種(兩種佈局其實前邊的佈局都是一樣的,後邊的按鈕不一樣,這種還是很好處理的,直接寫道一塊然後根據標識欄位顯示隱藏)

再次測試無論在列表底部還是頂部,重新整理ui都嗖嗖的

注意一點:notifyItemRangeChanged 更新的是資料來源,並不是專門用來更新 viewtype 的。所以在劃分 viewtype 的時候,一定要思路清晰,考慮清楚