gpt4 book ai didi

android - RecyclerView ListAdapter 没有正确更新列表

转载 作者:行者123 更新时间:2023-12-03 14:56:36 28 4
gpt4 key购买 nike

我正在使用 Android RoomRx Flowable更新 RecyclerView将对象从我的数据库中。为了获得更好的动画和性能,我更新了项目以使用新的 ListAdapter在我的项目中。

问题是当用户按下 Checkbox Task 对象更新为已完成,数据库会反射(reflect)此更改,但有时适配器 ListAdapter通知我的onBindViewHolder有时它说我的观点已经更新。

任务列表 fragment

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewModel.loadTasks(onTasksLoaded = { adapter.submitList(it) })
}

任务道
@Query("SELECT * FROM task")
fun getAllTasks(): Flowable<MutableList<Task>>

任务列表适配器
class TaskListAdapter : ListAdapter<Task, BindingHolder<*>>(TaskDiffCallback()) {

override fun onBindViewHolder(holder: BindingHolder<*>, position: Int) {
val task = getItem(position)
// more binding code

// THE ISSUE IS HERE
if (task.completed) {
holder.viewStrike.visibility = View.VISIBLE
} else {
holder.viewStrike.visibility = View.INVISIBLE
}
}

// more adapter code
}

任务
data class Task(
@ColumnInfo(name = "task_is_completed") var completed: Boolean = false,
@ColumnInfo(name = "task_description") var description: String,
@ColumnInfo(name = "task_category_id") var categoryId: Long? = null,
@ColumnInfo(name = "task_due_date") var dueDate: Calendar? = null
) : Parcelable {

@IgnoredOnParcel
@ColumnInfo(name = "task_id")
@PrimaryKey(autoGenerate = true)
var id: Long = 0
}

扩散
class TaskDiffCallback : DiffUtil.ItemCallback<Task>() {

override fun areItemsTheSame(oldItem: Task, newItem: Task) =
oldItem.id == newItem.id

override fun areContentsTheSame(oldItem: Task, newItem: Task) =
oldItem.task == newItem.task
}

调试应用程序,有时是 isCompleted字段更新正确,有时字段在 Diff 期间已经更新,因此它表示 View 没有更新。我找不到这个问题的任何模式。就我而言,有时 View holder.viewStrike改变它的可见性,有时它仍然处于不一致的状态。

该问题似乎与 ListAdapter 相关。它本身有时会发送 oldItem使用更新的值,因此没有要更新的差异。

我错过了任何实现吗?

最佳答案

可能会晚,但我会为其他人写一个答案。
您不应该以这种方式使用 areContentsTheSame。
您必须比较与这两个可以更改的对象相关的值。
喜欢:

 override fun areContentsTheSame(oldItem: Task, newItem: Task){
return if(oldItem.completed == newItem.completed && oldItem.description == newItem.description && oldItem.dueDate == newItem.dueDate)}
但是没有必要比较永远不会改变的值,例如:id

关于android - RecyclerView ListAdapter 没有正确更新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53503917/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com