RecyclerView(5) 使用 DiffUtil 刷新列表內(nèi)容

RecyclerView 這一系列文章是基于一個示例, 可以忽略示例實現(xiàn)細節(jié).
主要關注通用點.

1. 實現(xiàn) DiffUtil.ItemCallback

在 Adapter 文件中盼铁, 創(chuàng)建頂級類
并將 數(shù)據(jù)類型 作為參數(shù)傳遞.

class SleepNightDiffCallback : DiffUtil.ItemCallback<SleepNight>() {
}

需要實現(xiàn) ItemCallback 里的兩個方法:
areItemsTheSame 和 areContentsTheSame

完整如下:

class SleepNightDiffCallback : DiffUtil.ItemCallback<SleepNight>(){
    override fun areItemsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
        return oldItem.nightId == newItem.nightId // nightId 相同 則 認為 是相同的item
    }

    override fun areContentsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
        return oldItem == newItem // 是否包含相同的數(shù)據(jù):SleepNight 是一個數(shù)據(jù)類,此相等性檢查將檢查所有字段(Data 類自動定義的)
    }
}

2. 使用 ListAdapter 管理列表.

RecyclerView 提供適配器類 ListAdapter尝偎,可構(gòu)建由列表支持的 RecyclerView 適配器捉貌。

ListAdapter 會為跟蹤列表,并在列表更新通知適配器。

2.1 ListAdapter 源碼分析

public abstract class ListAdapter<T, VH extends RecyclerView.ViewHolder>
        extends RecyclerView.Adapter<VH> {

看一下源碼趁窃,它也是 繼承自 RecyclerView.Adapter.
特別地是, 泛型 T 類 作為 數(shù)據(jù)的類型.
因此可知, 它也會管理數(shù)據(jù)的.

它的構(gòu)造函數(shù)需要一個參數(shù) DiffUtil.ItemCallback

    protected ListAdapter(@NonNull DiffUtil.ItemCallback<T> diffCallback) {
        mHelper = new AsyncListDiffer<>(new AdapterListUpdateCallback(this),
                new AsyncDifferConfig.Builder<>(diffCallback).build());
    }

2.2 ListAdapter使用

修改成:

class SleepNightAdapter : ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {

SleepNight 表示 數(shù)據(jù)類型,
ViewHolder 原本的緩存
SleepNightDiffCallback 作為回調(diào)

2.3 刪除

SleepNightAdapter 中
(1)刪除 data字段, 因為 ListAdapter 會跟蹤列表
(2)刪除 getItemCount() , ListAdapter 已有實現(xiàn)
(3) 提供了 getItem, onBindViewHolder中使用它

2.4 使用 submitList() 及時更新列表

submitList() 的方法牧挣,用于告知 ListAdapter 列表新版本
調(diào)用此方法時:
(1)將新列表與舊列表進行差異比較,
檢測已添加醒陆、移除瀑构、移動或更改的項
(2)更新 RecyclerView 所顯示的項

sleepTrackerViewModel.nights.observe(viewLifecycleOwner, Observer {
   it?.let {
       adapter.submitList(it)
   }
})

至此, 已經(jīng)完成了 DiffUtil 的使用.
主要是
(1)借助與 ListAdapter 的實現(xiàn), 將DiffUtil.ItemCallback 作為參數(shù)傳遞;
(2)然后在數(shù)據(jù)變化時, 調(diào)用 ListAdapter.submitList;
(3)此時會回調(diào)自定義的ItemCallback, 比較新表和舊表, 確定哪些需要更新
(4)RecyclerView 上僅更新上面確定更新的項.

--- End ---

參考指南:
https://developer.android.com/codelabs/kotlin-android-training-diffutil-databinding?hl=zh-cn#4

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市刨摩,隨后出現(xiàn)的幾起案子寺晌,更是在濱河造成了極大的恐慌,老刑警劉巖澡刹,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呻征,死亡現(xiàn)場離奇詭異,居然都是意外死亡罢浇,警方通過查閱死者的電腦和手機陆赋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚷闭,“玉大人攒岛,你說我怎么就攤上這事“蹋” “怎么了灾锯?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嗅榕。 經(jīng)常有香客問我顺饮,道長,這世上最難降的妖魔是什么凌那? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任领突,我火速辦了婚禮,結(jié)果婚禮上案怯,老公的妹妹穿的比我還像新娘君旦。我一直安慰自己,他們只是感情好嘲碱,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布金砍。 她就那樣靜靜地躺著,像睡著了一般麦锯。 火紅的嫁衣襯著肌膚如雪恕稠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天扶欣,我揣著相機與錄音鹅巍,去河邊找鬼千扶。 笑死,一個胖子當著我的面吹牛骆捧,可吹牛的內(nèi)容都是我干的澎羞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼敛苇,長吁一口氣:“原來是場噩夢啊……” “哼妆绞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枫攀,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎来涨,沒想到半個月后图焰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蹦掐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年笤闯,在試婚紗的時候發(fā)現(xiàn)自己被綠了颗味。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浦马。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漠畜,靈堂內(nèi)的尸體忽然破棺而出憔狞,到底是詐尸還是另有隱情拍冠,我是刑警寧澤射众,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布厢洞,位于F島的核電站仇让,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躺翻。R本人自食惡果不足惜丧叽,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望公你。 院中可真熱鬧踊淳,春花似錦、人聲如沸陕靠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剪芥。三九已至垄开,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間税肪,已是汗流浹背溉躲。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留益兄,地道東北人锻梳。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像偏塞,于是被迫代替她去往敵國和親唱蒸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容