**//ViewModel类中的更新函数我认为主要问题是在ViewModel类中,因为它没有让它更新。我试过许多解决办法,但没有一个对我有帮助
fun updateTask(task : ToDoItem, isChecked : Boolean) = viewModelScope.launch {
val updateTask = task.copy(isCompleted = isChecked)
repository.updateTask(updateTask)
Log.d("Msg", updateTask.toString())
}
字符串
适配器类
class TodoAdapter(private val listener : OnItemClick) : ListAdapter<ToDoItem, TodoAdapter.TodoViewHolder>(DiffCallBack()){
inner class TodoViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
private val tvTask: TextView = itemView.findViewById(R.id.tvTask)
private val checkBox: CheckBox = itemView.findViewById(R.id.checkBox)
init {
checkBox.setOnClickListener{
val position = adapterPosition
if(position != RecyclerView.NO_POSITION){
val task = getItem(position)
listener.onCheckBoxClick(task, checkBox.isChecked)
}
}
}
fun bind(item: ToDoItem) {
tvTask.text = item.task
checkBox.isChecked = item.isCompleted
tvTask.paint.isStrikeThruText = item.isCompleted
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder {
val viewHolder = LayoutInflater.from(parent.context).inflate(R.layout.task_layout, parent, false)
return TodoViewHolder(viewHolder)
}
override fun onBindViewHolder(holder: TodoViewHolder, position: Int) {
val item = getItem(position)
holder.bind(item)
}
interface OnItemClick{
fun onCheckBoxClick(task : ToDoItem, isChecked : Boolean)
}
}
class DiffCallBack : DiffUtil.ItemCallback<ToDoItem>(){
override fun areItemsTheSame(oldItem: ToDoItem, newItem: ToDoItem): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: ToDoItem, newItem: ToDoItem): Boolean {
return oldItem.id == newItem.id
}
型
// Main Activity类
在main中,我实现了在viewModel中调用update()的接口
mAdapter = TodoAdapter(this)
binding.recyclerView.layoutManager = LinearLayoutManager(this)
binding.recyclerView.adapter = mAdapter
viewModel = ViewModelProvider(this,
ViewModelProvider.AndroidViewModelFactory.getInstance(application))[ToDoViewModel::class.java]
viewModel.tasks.observe(this, Observer {
mAdapter.submitList(it)
})
}
override fun onCheckBoxClick(task: ToDoItem, isChecked: Boolean) {
viewModel.updateTask(task, isChecked)
}
型
仓库类
suspend fun updateTask(task : ToDoItem){
dao.updateTask(task)
}
型
道班
@Update
suspend fun updateTask(task : ToDoItem)
型
数据类
@Entity(tableName = "todo_table")
data class ToDoItem (
val task : String,
var isCompleted : Boolean = false
){
@PrimaryKey(autoGenerate = true) var id : Int = 0
}
型
1条答案
按热度按时间xsuvu9jc1#
这可能就是问题所在。可能不是唯一的问题。
您的
areContentsTheSame
实作不正确。您应该比较在RecycleView中可见的所有属性。在本例中,它是task
和isCompleted
。您只是在比较ID,因此,当您更改isCompleted
的值时,DiffUtil不会检测到任何更改,并且复选框也不会更新。通常,我们使用一个
data
类作为列表中项的类型,然后你需要做的就是字符串