我正在尝试创建一个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
没有更新。
不是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) }