无法更改 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)
}
}
我正在尝试创建一个在其每个项目中都有复选框的 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)
}
}