Sobes.tech
Junior — Middle

Melyik mechanizmus segít a DiffUtil-ben csak a módosított részek frissítésében a listában?

sobes.tech MI

Válasz az MI-től

A DiffUtil belsejében, hogy csak a módosított elemek részeit frissítsük, a getChangePayload() módszert használjuk. Ez a mechanizmus lehetővé teszi, hogy pontosan meghatározzuk, melyik objektum mezők változtak, és ezeket az adatokat átadjuk az adapternek, hogy csak a megfelelő View részeket frissítse, nem az egész elemet.

Használati példa:

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

Az adapterben a onBindViewHolder metódusban feldolgozhatja ezt a payload-t, és csak a módosított mezőket frissítheti, ami javítja a teljesítményt és a felhasználói felület folyékonyságát.