背景
RecyclerView.Adapter#notifyDataSetChanged()
會每次刷新整個布局;- 每次手動調用
RecyclerView.Adapter#notifyItemXx
系列方法很麻煩; - 需要在新增的項目中跟舊的列表項重復時,只更新內容,而不是插入重復項。
DiffUtil
DiffUtil
就是為了簡化 RecyclerVeiw 更新數據操作而生。其關鍵類和方法如下:
類 | 方法 | 描述 |
---|---|---|
DiffUtil | public static DiffResult calculateDiff(Callback cb) | 根據 Callback 提供的數據分析出新舊數據列表的差異,返回 DiffResult |
DiffUtil.Callback | public abstract int getOldListSize() | 返回舊數據的數量 |
public abstract int getNewListSize() | 返回新數據的數量 | |
public abstract boolean areItemsTheSame(int oldItemPosition, int newItemPosition) | 決定兩個數據項是否是同一個 | |
public abstract boolean areContentsTheSame(int oldItemPosition, int newItemPosition) | (當兩個數據項是同一個時,)決定兩個數據項的內容是否同樣,或者說是否需要進行更新 | |
DiffUtil.DiffResult | public void dispatchUpdatesTo(final RecyclerView.Adapter adapter) | 將差異信息更新到 RecyclerView.Adapter 中 |
步驟
- 創建一個類實現
DiffUtil.Callback
; - 當新數據到來時,實例化自定義的 callback,傳入新舊數據;
- 在子線程調用
DiffUtil#calculateDiff
計算差異; - 將差異結果
DiffResult
更新到 RecyclerView.Adapter 中。
更多
- 使用
android.support.v7.recyclerview.extensions.ListAdapter
和android.support.v7.recyclerview.extensions.AsyncListDiffer