DiffUtil 優(yōu)雅替代RecyclerView 刷新(二)AsyncListDiffer 異步刷新

DiffUtil 用于計算兩個列表之間的差異并輸出將第一個列表轉(zhuǎn)換為第二個列表的更新操作列表,它可用于計算 RecyclerView 適配器的更新.

官方簡介語法

Diffutil處理數(shù)據(jù)耗時

出現(xiàn)原先:

DiffUtil 同步方案處理大量數(shù)據(jù)的時候耗時較長衍生出異步方案

解決方案:

AsyncListDiffer 在后臺通過 DiffUtil 計算兩個列表之間的差異的助手

主要方案: 異步刷新

主要對象:AsyncListDiffer<UserInfo>(this,RecyclerViewDiffItemCallBack()),DiffUtil.ItemCallback()

1:AsyncListDiffer():在后臺通過 DiffUtil 計算兩個列表之間的差異的助手

2:DiffUtil.ItemCallback() :新舊數(shù)據(jù)處理的監(jiān)聽

方法
class AsyncListDifferAdapter(mContext: Context) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

var mContext: Context? = null
var diff: AsyncListDiffer<UserInfo>? = null
init {
    this.mContext = mContext
    diff=AsyncListDiffer<UserInfo>(this,RecyclerViewDiffItemCallBack())
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {

    var binding = DataBindingUtil.inflate<ItemMainOneBinding>(
        LayoutInflater.from(mContext),
        R.layout.item_main_one,
        parent,
        false
    )
    var holder = KtDataBindingViewHolder(binding.root)
    holder.binding = binding
    return holder

}

fun setDatas(newList: List<UserInfo>) {
    if(diff==null)return
    diff!!.submitList(newList)
}

/**
 * @param payloads A non-null list of merged payloads. Can be empty list if requires full
 *                update.
 */

override fun onBindViewHolder(
    holder: RecyclerView.ViewHolder,
    position: Int,
    payloads: MutableList<Any>
) {
    // payloads  為null 整條數(shù)據(jù)刷新
    if (payloads.isEmpty() || payloads.size <= 0) {
        super.onBindViewHolder(holder, position, payloads)
    } else {
        //局部更新   不會更新整個item 更新指定的控件
        var bundle = payloads.get(0) as Bundle
        if (bundle != null) {
            var name = bundle.getString("name")
            var phoneNum = bundle.getString("phoneNum")
            var holder = holder as KtDataBindingViewHolder
            var binding = holder.binding as ItemMainOneBinding
            if (!TextUtils.isEmpty(name)) {
                binding.tvName.text = name
            }
            if (!TextUtils.isEmpty(phoneNum)) {
                binding.tvPhone.text = phoneNum
            }
        }
    }
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    Log.e("繪制:", "" + position)
    var holder = holder as KtDataBindingViewHolder
    var binding = holder.binding as ItemMainOneBinding
    binding.tvName.setText(getItem(position)!!.name)
    binding.tvPhone.setText(getItem(position)!!.phoneNum)
}

fun getItem(position: Int): UserInfo {
    return diff!!.currentList.get(position)
}

fun getItems():List<UserInfo>{
   return diff!!.currentList
}

override fun getItemCount(): Int {
    return diff!!.currentList.size
}

}

調(diào)用:

 private fun setNewData() {
    var userList = ArrayList<UserInfo>()
    for (index in 0..10) {
        var userInfo = UserInfo()
        if (index == 0) {
            userInfo.name = "開始"
        } else if (index == 10) {
            userInfo.name = "結(jié)束"
        } else {
            userInfo.name = "測試" + index
        }
        userInfo.id = index
        userInfo.phoneNum = "1853853738" + index
        userList.add(userInfo)
    }
    mAdapter!!.setDatas(userList)
}

Demo源碼,歡迎star

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厅各,一起剝皮案震驚了整個濱河市壹罚,隨后出現(xiàn)的幾起案子七婴,更是在濱河造成了極大的恐慌饶氏,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毒坛,死亡現(xiàn)場離奇詭異望伦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)煎殷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門屯伞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豪直,你說我怎么就攤上這事劣摇。” “怎么了弓乙?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵末融,是天一觀的道長。 經(jīng)常有香客問我暇韧,道長勾习,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任懈玻,我火速辦了婚禮巧婶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涂乌。我一直安慰自己艺栈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布骂倘。 她就那樣靜靜地躺著眼滤,像睡著了一般巴席。 火紅的嫁衣襯著肌膚如雪历涝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音荧库,去河邊找鬼堰塌。 笑死,一個胖子當(dāng)著我的面吹牛分衫,可吹牛的內(nèi)容都是我干的场刑。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼蚪战,長吁一口氣:“原來是場噩夢啊……” “哼牵现!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邀桑,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤瞎疼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后壁畸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贼急,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年捏萍,在試婚紗的時候發(fā)現(xiàn)自己被綠了太抓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡令杈,死狀恐怖走敌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逗噩,我是刑警寧澤悔常,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站给赞,受9級特大地震影響机打,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜片迅,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一残邀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柑蛇,春花似錦芥挣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盆耽,卻和暖如春蹋砚,著一層夾襖步出監(jiān)牢的瞬間扼菠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工坝咐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留循榆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓墨坚,卻偏偏與公主長得像秧饮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泽篮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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