RecyclerView ListAdapter не обновляет список правильно - PullRequest
0 голосов
/ 27 ноября 2018

Я использую 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 с обновленным значением, поэтомунет различий для обновления.

Мне не хватает какой-либо реализации?

...