Sobes.tech
Junior — Middle

Welcher Mechanismus in DiffUtil hilft dabei, nur die geänderten Teile eines Elements in der Liste zu aktualisieren?

sobes.tech KI

Antwort von AI

Innerhalb von DiffUtil, um nur die geänderten Teile eines Elements zu aktualisieren, wird die Methode getChangePayload() verwendet. Dieser Mechanismus ermöglicht es, genau zu bestimmen, welche Felder des Objekts sich geändert haben, und diese Daten an den Adapter zu übergeben, um nur die entsprechenden Teile der View zu aktualisieren, anstatt das gesamte Element.

Beispiel für die Verwendung:

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

Im Adapter kann dieser Payload im onBindViewHolder-Methode verarbeitet werden, um nur die geänderten Felder zu aktualisieren, was die Leistung und die Fließfähigkeit der Benutzeroberfläche verbessert.