问题描述
我实现了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