无法在ListAdapter的currentList中更改项目数据

问题描述 投票:0回答:1

我正在尝试创建一个RecyclerView,该项目的每个项目都具有复选框。我遵循此link保存复选框的状态,即向我的对象添加一个布尔变量。但是,我遇到一个问题,我的对象的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行运行后,即使本地isChecked项目的值已更新,我仍可以看到currentList中的值Document没有更新。

android android-recyclerview android-checkbox android-listadapter
1个回答
0
投票

不是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) }
© www.soinside.com 2019 - 2024. All rights reserved.