Recyclerview-Diffutils

是什么

DiffUtil是一個工具類告材,當你的RecyclerView需要更新數(shù)據(jù)時枷踏,將新舊數(shù)據(jù)集傳給它凿可,它就能快速告知adapter有哪些數(shù)據(jù)需要更新繁仁。就相當于如果改變了就對某個item刷新涉馅,沒改變就沒刷新,可以簡稱為局部刷新黄虱。

使用

/**
     * 當使用Diffutils的時候稚矿,這是一個計算2個list不同的回調(diào)函數(shù)
     */
    public abstract static class Callback {

        /**
         * 得到老的數(shù)據(jù)源大小
         */
        public abstract int getOldListSize();

        /**
         * 得到新的數(shù)據(jù)源大小
         */
        public abstract int getNewListSize();

        /**
         * 
         * 被DiffUtil調(diào)用,用來判斷 兩個對象是否是相同的Item捻浦。
         * 例如晤揣,如果你的Item有唯一的id字段,這個方法就判斷id是否相等默勾。
         */
        public abstract boolean areItemsTheSame(int oldItemPosition, int newItemPosition);

        /**
         * 用來檢查 兩個item是否含有相同的數(shù)據(jù)
         * 這個方法僅僅在areItemsTheSame()返回true時碉渡,才調(diào)用。
         */
        public abstract boolean areContentsTheSame(int oldItemPosition, int newItemPosition);
        /**
         * 當areItemsTheSame(int, int)返回true母剥,且areContentsTheSame(int, int)返回false時滞诺,DiffUtils會回調(diào)此方法,
         * 去得到這個Item(有哪些)改變的payload环疼。
         * 例如习霹,如果你用RecyclerView配合DiffUtils,你可以返回  這個Item改變的那些字段炫隶,可以用那些信息去執(zhí)行正確的動畫
         * 返回 一個 代表著新老item的改變內(nèi)容的 payload對象淋叶,
         */
        @Nullable
        public Object getChangePayload(int oldItemPosition, int newItemPosition) {
            return null;
        }
    }

Callback用來設置數(shù)據(jù)源的比較規(guī)則,判斷新老數(shù)據(jù)之間的差異伪阶。

基礎使用

Callback

package com.example.helloview.recyclerview.diffutils

import androidx.recyclerview.widget.DiffUtil

class UserCallBack(val oldList: List<UserBean>, val newList: List<UserBean>) :
    DiffUtil.Callback() {


    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) =
        oldList[oldItemPosition].id == newList[newItemPosition].id

    override fun getOldListSize() = oldList.size
    override fun getNewListSize() = newList.size

    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        val oldBean = oldList[oldItemPosition]
        val newBean = newList[newItemPosition]
        return oldBean.firstName == newBean.firstName && oldBean.lastName == newBean.lastName
    }
}

局部刷新

private fun diffData() {
        val newList = mutableListOf<UserBean>()
        val oldList = mutableListOf<UserBean>()
        newList.addAll(data)
        oldList.addAll(data)

        newList[2] = UserBean(20,"diff--","數(shù)據(jù)更新")
        val callback = UserCallBack(oldList,newList)

        //計算差異item
        val diffResult = DiffUtil.calculateDiff(callback,true)
         // 注意此處一定要將新數(shù)據(jù)設置給Adapter
         // 否則會造成ui刷新了但數(shù)據(jù)未更新的bug
        mAdapter?.setData(newList)
        //調(diào)用adapter的局部更新方法
        diffResult.dispatchUpdatesTo(mAdapter!!)
    }
  • 首先DiffUtil.calculateDiff()這個方法是執(zhí)行在主線程的煞檩,如果新舊數(shù)據(jù)List比較大,那么這個方法鐵定是會阻塞主線程的
  • 計算出DiffResult后栅贴,咱們必須要將新數(shù)據(jù)設置給Adapter斟湃,然后才能調(diào)用DiffResult.dispatchUpdatesTo(Adapter)刷新ui,然而很多人都會忘記這一步檐薯。
diff.gif
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凝赛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坛缕,更是在濱河造成了極大的恐慌墓猎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赚楚,死亡現(xiàn)場離奇詭異毙沾,居然都是意外死亡,警方通過查閱死者的電腦和手機宠页,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門搀军,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膨俐,“玉大人,你說我怎么就攤上這事罩句。” “怎么了敛摘?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵门烂,是天一觀的道長。 經(jīng)常有香客問我兄淫,道長屯远,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任捕虽,我火速辦了婚禮慨丐,結果婚禮上,老公的妹妹穿的比我還像新娘泄私。我一直安慰自己房揭,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布晌端。 她就那樣靜靜地躺著捅暴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咧纠。 梳的紋絲不亂的頭發(fā)上蓬痒,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音漆羔,去河邊找鬼梧奢。 笑死,一個胖子當著我的面吹牛演痒,可吹牛的內(nèi)容都是我干的亲轨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫡霞,長吁一口氣:“原來是場噩夢啊……” “哼瓶埋!你這毒婦竟也來了?” 一聲冷哼從身側響起诊沪,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤养筒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后端姚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晕粪,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年渐裸,在試婚紗的時候發(fā)現(xiàn)自己被綠了巫湘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片装悲。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尚氛,靈堂內(nèi)的尸體忽然破棺而出诀诊,到底是詐尸還是另有隱情,我是刑警寧澤阅嘶,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布属瓣,位于F島的核電站,受9級特大地震影響讯柔,放射性物質發(fā)生泄漏抡蛙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一魂迄、第九天 我趴在偏房一處隱蔽的房頂上張望粗截。 院中可真熱鬧,春花似錦捣炬、人聲如沸熊昌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浴捆。三九已至,卻和暖如春稿械,著一層夾襖步出監(jiān)牢的瞬間选泻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工美莫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留页眯,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓厢呵,卻偏偏與公主長得像窝撵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子襟铭,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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