package com.xscm.moduleutil.diff import android.os.Bundle import androidx.recyclerview.widget.DiffUtil import com.xscm.moduleutil.bean.CircleListBean class CircleListDiffCallback( private val oldList: List?, private val newList: List? ) : DiffUtil.Callback() { override fun getOldListSize(): Int { return oldList?.size ?: 0 } override fun getNewListSize(): Int { return newList?.size ?: 0 } override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return oldList!![oldItemPosition].id == newList!![newItemPosition].id } override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { val oldItem = oldList!![oldItemPosition] val newItem = newList!![newItemPosition] // 判断核心数据是否一致(排除动态字段) if (!equalsStr(oldItem.nickname, newItem.nickname)) return false if (!equalsStr(oldItem.avatar, newItem.avatar)) return false if (!equalsStr(oldItem.content, newItem.content)) return false if (oldItem.is_like != newItem.is_like) return false if (oldItem.sex != newItem.sex) return false if (!equalsStr(oldItem.images, newItem.images)) return false // 动态字段不参与整体比较(让 getChangePayload 控制) return equalsStr(oldItem.rewards_num, newItem.rewards_num) && equalsStr(oldItem.like_num, newItem.like_num) && equalsStr(oldItem.comment_num, newItem.comment_num) // && equalsStr(oldItem.read_num, newItem.read_num) } override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { val oldItem = oldList!![oldItemPosition] val newItem = newList!![newItemPosition] val diff = Bundle() if (!equalsStr(oldItem.rewards_num, newItem.rewards_num)) { diff.putString("rewards_num", newItem.rewards_num) } if (!equalsStr(oldItem.like_num, newItem.like_num)) { diff.putString("like_num", newItem.like_num) diff.putInt("is_like",newItem.is_like) } if (!equalsStr(oldItem.comment_num, newItem.comment_num)) { diff.putString("comment_num", newItem.comment_num) } // if (!equalsStr(oldItem.read_num, newItem.read_num)) { // diff.putString("read_num", newItem.read_num) // } return if (diff.size() == 0) null else diff } private fun equalsStr(a: String?, b: String?): Boolean { if (a == null && b == null) return true if (a == null || b == null) return false return a == b } }