Android 使用 DiffUtil 處理 RecyclerView 數據更新問題


背景

  1. RecyclerView.Adapter#notifyDataSetChanged() 會每次刷新整個布局;
  2. 每次手動調用 RecyclerView.Adapter#notifyItemXx 系列方法很麻煩;
  3. 需要在新增的項目中跟舊的列表項重復時,只更新內容,而不是插入重復項。

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 中

步驟

  1. 創建一個類實現 DiffUtil.Callback
  2. 當新數據到來時,實例化自定義的 callback,傳入新舊數據;
  3. 在子線程調用 DiffUtil#calculateDiff 計算差異;
  4. 將差異結果 DiffResult 更新到 RecyclerView.Adapter 中。

更多

  • 使用 android.support.v7.recyclerview.extensions.ListAdapterandroid.support.v7.recyclerview.extensions.AsyncListDiffer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM