如何为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

解决方法

取决于您的数据的独特性。当然如果你有一些唯一的标识符会更好,但也许你的 Header 的标题已经是唯一的,并且描述的内容已经可以改变?这样你就可以像下面这样使用(如果你愿意,你可以更深入地了解 Item 以区分图像视频和声音)

pivoted_df = pivoted_df.drop([('Value','start'),('Type','start')],axis='columns')
pivoted_df.columns = ['end_time','start_time','value','type']
pivoted_df
                end_time             start_time value type
Trial                                                     
1      2021-07-03 16:11:00  2021-07-03 15:12:00     1  2.a
2      2021-07-04 15:50:00  2021-07-04 14:25:00     1  2.a
3      2021-07-04 18:06:00  2021-07-04 17:07:00     2  2.c
4      2021-07-05 00:00:00  2021-07-04 20:14:00     3  2.a