Что такое getChangePayload в DiffUtil

«Что такое getChangePayload в DiffUtil» — вопрос из категории UI и Views, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

getChangePayload в DiffUtil позволяет оптимизировать обновления RecyclerView, возвращая только изменённые данные вместо полного пересоздания ViewHolder.

Когда areItemsTheSame возвращает true, но areContentsTheSamefalse, DiffUtil вызывает getChangePayload. Вместо notifyItemChanged(position), можно использовать notifyItemChanged(position, payload) и обработать частичное обновление в onBindViewHolder.

Пример:

override fun getChangePayload(oldItem: Item, newItem: Item): Any? {
    val diff = Bundle()
    if (oldItem.text != newItem.text) {
        diff.putString("text", newItem.text)
    }
    return if (diff.isEmpty) null else diff
}

// В адаптере:
override fun onBindViewHolder(holder: ViewHolder, position: Int, payloads: List<Any>) {
    if (payloads.isNotEmpty()) {
        val bundle = payloads[0] as Bundle
        bundle.getString("text")?.let { holder.textView.text = it }
    } else {
        super.onBindViewHolder(holder, position, payloads)
    }
}

Это уменьшает количество вызовов onBindViewHolder и улучшает производительность.