This commit is contained in:
Horis
2024-09-08 17:24:43 +08:00
parent 4cb69f6c10
commit 230b6e884c
@@ -115,19 +115,21 @@ abstract class RecyclerAdapter<ITEM, VB : ViewBinding>(protected val context: Co
kotlin.runCatching { kotlin.runCatching {
val oldItems = this.items.toList() val oldItems = this.items.toList()
val itemsSize = items?.size ?: 0 val itemsSize = items?.size ?: 0
val headerCount = getHeaderCount()
val footerCount = getFooterCount()
val callback = object : DiffUtil.Callback() { val callback = object : DiffUtil.Callback() {
override fun getOldListSize(): Int { override fun getOldListSize(): Int {
return itemCount return itemCount
} }
override fun getNewListSize(): Int { override fun getNewListSize(): Int {
return (items?.size ?: 0) + getHeaderCount() + getFooterCount() return itemsSize + headerCount + footerCount
} }
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
val oldItem = oldItems.getOrNull(oldItemPosition - getHeaderCount()) val oldItem = oldItems.getOrNull(oldItemPosition - headerCount)
?: return true ?: return true
val newItem = items?.getOrNull(newItemPosition - getHeaderCount()) val newItem = items?.getOrNull(newItemPosition - headerCount)
?: return true ?: return true
return itemCallback.areItemsTheSame(oldItem, newItem) return itemCallback.areItemsTheSame(oldItem, newItem)
} }
@@ -136,17 +138,17 @@ abstract class RecyclerAdapter<ITEM, VB : ViewBinding>(protected val context: Co
oldItemPosition: Int, oldItemPosition: Int,
newItemPosition: Int newItemPosition: Int
): Boolean { ): Boolean {
val oldItem = oldItems.getOrNull(oldItemPosition - getHeaderCount()) val oldItem = oldItems.getOrNull(oldItemPosition - headerCount)
?: return true ?: return true
val newItem = items?.getOrNull(newItemPosition - getHeaderCount()) val newItem = items?.getOrNull(newItemPosition - headerCount)
?: return true ?: return true
return itemCallback.areContentsTheSame(oldItem, newItem) return itemCallback.areContentsTheSame(oldItem, newItem)
} }
override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? {
val oldItem = oldItems.getOrNull(oldItemPosition - getHeaderCount()) val oldItem = oldItems.getOrNull(oldItemPosition - headerCount)
?: return null ?: return null
val newItem = items?.getOrNull(newItemPosition - getHeaderCount()) val newItem = items?.getOrNull(newItemPosition - headerCount)
?: return null ?: return null
return itemCallback.getChangePayload(oldItem, newItem) return itemCallback.getChangePayload(oldItem, newItem)
} }