Sobes.tech
Junior — Middle

Kura mehānisma iekšā DiffUtil palīdz atjaunināt tikai mainītās elementa daļas sarakstā?

sobes.tech AI

Atbilde no AI

DiffUtil ietvaros, lai atjauninātu tikai mainītās elementa daļas, tiek izmantota metode getChangePayload(). Šis mehānisms ļauj precīzi noteikt, kuri objekta lauki ir mainījušies, un nodot šos datus adapterim, lai atjauninātu tikai attiecīgās View daļas, nevis visu elementu.

Piemērs lietošanai:

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

Adaptera onBindViewHolder metodē var apstrādāt šo payload un atjaunināt tikai mainītās lauciņus, kas uzlabo veiktspēju un interfeisa plūstamību.