Junior — Middle
Qual mecanismo dentro do DiffUtil ajuda a atualizar apenas as partes alteradas de um elemento na lista?
sobes.tech IA
Resposta da IA
Dentro do DiffUtil, para atualizar apenas as partes modificadas de um elemento, utiliza-se o método getChangePayload(). Este mecanismo permite determinar exatamente quais os campos do objeto que mudaram, e passar esses dados ao adaptador para atualizar apenas as partes correspondentes da View, em vez de todo o elemento.
Exemplo de uso:
class MyDiffCallback : DiffUtil.Callback() {
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition].id == newList[newItemPosition].id
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition] == newList[newItemPosition]
}
override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? {
val oldItem = oldList[oldItemPosition]
val newItem = newList[newItemPosition]
val diffBundle = Bundle()
if (oldItem.title != newItem.title) {
diffBundle.putString("KEY_TITLE", newItem.title)
}
if (oldItem.description != newItem.description) {
diffBundle.putString("KEY_DESCRIPTION", newItem.description)
}
return if (diffBundle.size() == 0) null else diffBundle
}
}
No adaptador, no método onBindViewHolder, pode-se processar essa carga útil e atualizar apenas os campos modificados, o que melhora o desempenho e a fluidez da interface.