我的待办事项应用程序使用Room存储数据。它有两个片段:任务列表和任务详细信息(添加和编辑任务)。问题是,当我更新TaskDetailsFragment中的Task的isFavourite
字段时,先前片段中的列表未更新(显示了旧的isFavourite
值)。我使用了双向数据绑定来连接LiveData和视图。所有其他字段(title
,description
,isCompleted
)在编辑后都会正确更新,只有isFavourite
CheckBox出了问题。有时,当我滚动到列表的末尾(更新的项目不可见)或重新启动应用程序时,该值会正确更新。此外,当直接从列表视图更新isFavourite
值时,CheckBox行为是正确的。仅从另一个Fragment更新它是有问题的。
RecyclerViewAdapter:
override fun onBindViewHolder(holder: TaskViewHolder, position: Int) {
val task = tasks[position]
holder.taskCheckBox.apply {
setOnCheckedChangeListener { _, isChecked ->
Timber.i(isChecked.toString())
taskViewClickListener.onCheckBoxClick(position, task, isChecked)
}
isChecked = task.isCompleted
setTintListByColor(task.priority.color)
}
holder.taskTitleTextView.apply {
text = task.title
setOnClickListener {
taskViewClickListener.onTaskClick(position, task)
}
}
holder.isTaskFavouriteCheckBox.apply {
setOnCheckedChangeListener { _, isChecked ->
taskViewClickListener.onFavouriteClick(position, task, isChecked)
}
isChecked = task.isFavourite
}
}
fun updateTasksList(newTasks: List<Task>) {
val callback = TaskDiffCallback(tasks, newTasks)
val result = DiffUtil.calculateDiff(callback)
tasks.apply {
clear()
addAll(newTasks)
}
result.dispatchUpdatesTo(this)
}
TaskDao:
@Query("SELECT * FROM tasks WHERE is_completed = 0 ORDER BY creation_date DESC")
fun getAllOrderedByCreationDate(): Flow<List<Task>>
@Update
suspend fun update(task: Task)
任务存储库:
fun getAll(): Flow<List<Task>> {
return taskDao.getAllOrderedByCreationDate()
}
TaskViewModel:
var tasks: LiveData<List<Task>> = taskRepository.getAll().asLiveData()
任务片段:
viewModel.tasks.observe(this) {
recyclerViewAdapter.updateTasksList(it)
}
TaskDetailsViewModel:
fun saveTask(inEditMode: Boolean) {
val success = updateTaskDetails()
if (success) {
if (inEditMode)
updateTask(task)
else
insertTask(task)
scheduleReminder()
_taskSaved.call()
}
}
private fun updateTaskDetails(): Boolean {
val title = taskTitle.value
val description = taskDescription.value
val priority = taskPriority.value
val isFavourite = isTaskFavourite.value
val isCompleted = isTaskCompleted.value
if (title.isNullOrBlank()) {
_taskError.value = "Task title cannot be empty"
return false
}
if (priority == null) {
_taskError.value = "Task priority cannot be empty"
return false
}
if (isFavourite == null)
return false
if (isCompleted == null)
return false
with(task) {
this.title = title
this.description = description
this.priority = priority
this.isFavourite = isFavourite
this.isCompleted = isCompleted
}
return true
}
fun updateTask(task: Task) {
viewModelScope.launch(Dispatchers.IO) {
taskRepository.update(task)
}
}