Я использую Android Room
и Rx Flowable
для обновления RecyclerView
объекта из моей базы данных.Для лучшей анимации и производительности я обновил проект, чтобы использовать новый ListAdapter в моем проекте.
Проблема заключается в том, что когда пользователь нажимает Checkbox
, объект задачи обновляется как завершенный,база данных отражает это изменение, но иногда адаптер ListAdapter
уведомляет мой onBindViewHolder
, а иногда говорит, что мое представление уже обновлено.
TaskListFragment
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewModel.loadTasks(onTasksLoaded = { adapter.submitList(it) })
}
TaskDao
@Query("SELECT * FROM task")
fun getAllTasks(): Flowable<MutableList<Task>>
TaskListAdapter
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
}
Task
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
}
DiffUtil
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, поэтому оно говорит, что представление не имеет обновлений.Я не мог найти образец для этой проблемы.В моем случае иногда представление holder.viewStrike
меняет свою видимость, а иногда остается в несогласованном состоянии.
Проблема, похоже, связана с самим ListAdapter
, который иногда отправляет oldItem
с обновленным значением, поэтомунет различий для обновления.
Мне не хватает какой-либо реализации?