我实现ListAdapter
了,那个 T 是密封类ViewHolderModel
。然后,我尝试实现DiffUtil.ItemCallback
要使用的Adapter,但是遇到了一个问题。
ViewHolderModel
包括各种数据对象,它们是唯一的,一些对象是不明确的。
如何实现高效的 ItemCallback?
ViewHolderModel(密封类)
sealed class ViewHolderModel {
object Error : ViewHolderModel()
object Footer : ViewHolderModel()
data class Header(
val title: String,
val description: String,
...
) : ViewHolderModel()
sealed class Item : ViewHolderModel() {
abstract val id: Long
abstract val thumbnail: String
data class Image(
override val id: Long,
override val thumbnail: String
...
) : Item()
data class Video(
override val id: Long,
override val thumbnail: String
...
) : Item()
data class Sound(
override val id: Long,
override val thumbnail: String
...
) : Item()
}
}
项目回调
companion object {
val Comparator by lazy {
object : DiffUtil.ItemCallback<ViewHolderModel>() {
override fun areItemsTheSame(oldItem: ViewHolderModel, newItem: ViewHolderModel): Boolean =
???
override fun areContentsTheSame(
oldItem: ViewHolderModel,
newItem: ViewHolderModel
): Boolean = oldItem == newItem
}
}
}
我尝试将抽象字段(id)添加到ViewHolderModel
如下,但看起来不太好。还有比这更好的方法吗?
sealed class ViewHolderModel {
abstract val id : Long
object Error : ViewHolderModel() {
override val id: Long
get() = Long.MIN_VALUE
}
object Footer : ViewHolderModel() {
override val id: Long
get() = Long.MIN_VALUE + 1
}
...
// in ItemCallback
override fun areItemsTheSame(oldItem: ViewHolderModel, newItem: ViewHolderModel): Boolean =
oldItem.id == newItem.id