Sobes.tech
Junior — Middle

DiffUtil-ის შიგნით რომელი მექანიზმი ეხმარება სიაში მხოლოდ შეცვლილი ნაწილების განახლებაში?

sobes.tech AI

პასუხი AI-სგან

DiffUtil-ის შიგნით, მხოლოდ ცვლილებული ელემენტის ნაწილების განახლებისთვის გამოიყენება მეთოდი getChangePayload(). ეს მექანიზმი საშუალებას აძლევს ზუსტად განსაზღვროს, რომელი ობიექტის ველები შეიცვალა, და გადმოსცეს ეს მონაცემები ადაპტერს, რათა განაახლოს მხოლოდ შესაბამისი View-ის ნაწილები, მთელი ელემენტი არა.

გამოყენების მაგალითი:

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

ადაპტერში, onBindViewHolder მეთოდში, შეიძლება ამ payload-ის დამუშავება და მხოლოდ ცვლილებული ველების განახლება, რაც გაუმჯობესებს შესრულებას და სუფთა ინტერფეისს.