sqlite 如何更新Room Database中复选框,该复选框未在房间中更新

xxb16uws  于 2023-08-06  发布在  SQLite
关注(0)|答案(1)|浏览(143)

**//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
}

xsuvu9jc

xsuvu9jc1#

这可能就是问题所在。可能不是唯一的问题。
您的areContentsTheSame实作不正确。您应该比较在RecycleView中可见的所有属性。在本例中,它是taskisCompleted。您只是在比较ID,因此,当您更改isCompleted的值时,DiffUtil不会检测到任何更改,并且复选框也不会更新。
通常,我们使用一个data类作为列表中项的类型,然后你需要做的就是

override fun areContentsTheSame(oldItem: ToDoItem, newItem: ToDoItem) =
    oldItem == newItem

字符串

相关问题