如何为ItemCallback的密封类设置唯一的ID? ViewHolderModel密封类 ItemCallback

问题描述

我实现了ListAdapter,即T是密封类ViewHolderModel。然后,我尝试实现DiffUtil.ItemCallback以用作适配器,但遇到了问题。

ViewHolderModel包含各种数据对象,它们是唯一的ID,有些对象是模棱两可的。

如何实现有效的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()
    }
}

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
        }
    }
}

我尝试如下将抽象字段(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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)