Как изменить состояние CheckBox у одного элемента в RecyclerView без лишних перерисовок

«Как изменить состояние CheckBox у одного элемента в RecyclerView без лишних перерисовок» — вопрос из категории UI и Views, который задают на 24% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Используйте notifyItemChanged(position) для обновления только конкретного элемента. Чтобы избежать мерцания, переопределите getChangePayload() в адаптере:

override fun onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList<Any>) {
    if (payloads.isNotEmpty()) {
        // Обновляем только чекбокс
        holder.checkBox.isChecked = items[position].isChecked
    } else {
        super.onBindViewHolder(holder, position, payloads)
    }
}

override fun getChangePayload(oldItem: Item, newItem: Item): Any? {
    return if (oldItem.isChecked != newItem.isChecked) true else null
}

// При изменении состояния:
fun toggleItem(position: Int) {
    items[position].isChecked = !items[position].isChecked
    notifyItemChanged(position, true)
}