Files
yusheng-android/BaseModule/src/main/java/com/xscm/moduleutil/diff/CircleDiffCallback.kt
2025-11-07 09:22:39 +08:00

73 lines
2.6 KiB
Kotlin

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<CircleListBean>?,
private val newList: List<CircleListBean>?
) :
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
}
}