Sobes.tech
Junior — Middle

Koji mehanizam unutar DiffUtil pomaže da se ažuriraju samo izmenjeni delovi elementa na listi?

sobes.tech АИ

Одговор од АИ

Unutar DiffUtil, za ažuriranje samo izmenjenih delova elementa, koristi se metoda getChangePayload(). Ovaj mehanizam omogućava da se tačno odredi koja polja objekta su se promenila i da se ti podaci proslede adapteru kako bi se ažurirali samo odgovarajući delovi View-a, a ne ceo element.

Primer upotrebe:

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

U adapteru, u metodi onBindViewHolder, može se obraditi ovaj payload i ažurirati samo izmenjena polja, što poboljšava performanse i glatkoću interfejsa.