无法更改 ListAdapter 的 currentList 内的项目数据

Cannot change item data inside currentList of ListAdapter

我正在尝试创建一个在其每个项目中都有复选框的 RecyclerView。我按照这个 来保存复选框的状态,即向我的对象添加一个布尔变量。但是,我遇到了无法更改对象中的 isChecked 值的问题。 currentList的内容是不可变的吗?有什么方法可以让我用 ListAdapter 实现这个功能吗?

这是我的代码片段。非常感谢。

class DocumentAdapter() : ListAdapter<Document, DocumentAdapter.DocumentViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DocumentViewHolder {
        return LayoutInflater.from(parent.context)
            .inflate(R.layout.item_document, parent, false)
            .let {
                DocumentViewHolder(it)
            }
    }

    override fun onBindViewHolder(holder: VH, position: Int) {
        holder.bind(getItem(position))
    }

    class DocumentViewHolder(
        override val view: View
    ) : RecyclerView.ViewHolder<DocumentDTO>(view) {

        fun bind(item: Document) {
            cbItem.isChecked = item.isChecked
            cbItem.setOnCheckedChangeListener { _, isChecked ->
                item.isChecked = isChecked // Not working
            }
        }
    }
}

调试时,在 运行 通过行 item.isChecked = isChecked 之后,我可以看到 currentList 中的值 isChecked 没有更新,即使本地 Document 项目已更新。

并不是说 ListAdapter 的内容是不可变的,而是从我在您的代码片段中看到的,Document 的 isChecked 变量是不可变的。

Document 对象本身应该能够保存需要显示的当前项目的状态数据。如果您不能调整 Document 对象本身,我会创建一个 DocumentWrapper 对象,它允许您创建一个初始的和可变的检查状态。

class DocWrapper(val document: Document) {
  var isChecked = document.isChecked
}

您可以在提交到 ListAdapter 之前映射您的数据

val docList = List<Document>()
val docWrapperList: List<DocWrapper> = docList.map { DocWrapper(it) }

由于必须通过 submitList() 提交对 ListAdapter 内容的更改,因此我必须创建一个回调并将更新的项目发送出去以更新数据。

    fun bind(item: Document) {
        cbItem.isChecked = item.isChecked
        cbItem.setOnCheckedChangeListener { _, isChecked ->
            item.isChecked = isChecked
            onCheckBoxClicked(item, isChecked)
        }
    }