Невозможно изменить данные элемента в currentList ListAdapter - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь создать 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, я вижу, что значение isChecked внутри currentList не обновляется, хотя это значение локального Document товар обновлен.

1 Ответ

0 голосов
/ 17 июня 2020

Дело не в том, что содержимое ListAdapter неизменяемо, а в том, что из того, что я вижу в вашем фрагменте кода, переменная isChecked Document является неизменной.

Сам объект 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) }
...