Sobes.tech
Junior — Middle

Quel mécanisme dans DiffUtil aide à mettre à jour uniquement les parties modifiées d'un élément dans la liste?

sobes.tech IA

Réponse de l'IA

Dans DiffUtil, pour mettre à jour uniquement les parties modifiées d’un élément, la méthode getChangePayload() est utilisée. Ce mécanisme permet de déterminer précisément quels champs de l’objet ont changé, et de transmettre ces données à l’adaptateur pour mettre à jour uniquement les parties correspondantes de la vue, plutôt que l’élément entier.

Exemple d’utilisation :

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
    }
}

Dans l’adaptateur, dans la méthode onBindViewHolder, vous pouvez traiter cette charge utile et mettre à jour uniquement les champs modifiés, ce qui améliore la performance et la fluidité de l’interface.