I implemented ListAdapter
, that T is sealed class ViewHolderModel
. Then, I trying to implement DiffUtil.ItemCallback
to be used Adapter, but I faced a problem.
ViewHolderModel
included various data objects, they are unique id of some objects are ambiguous.
How can I implement efficient ItemCallback?
ViewHolderModel (sealed class)
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()
}
}
ItemCallback
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
}
}
}
I tried to add abstract field(id) to ViewHolderModel
as below but isn't look good. Is there a better way than this?
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