[譯] 使用 leanback 的 DiffCallback: 和 DiffUtil 回調之間的區別

使用 leanback 的 DiffCallback: 和 DiffUtil 回調之間的區別

24.2 版本的 support library 裏引入了一個叫作 DiffUtil 的類,它讓刷新 RecyclerView.Adapter 變得更簡單。在 27.0 版本的 leanback support library 裏面又增長了一個支持 ArrayObjectAdapter 的抽象 DiffUtilhtml

ArrayObjectAdapter 有一個新的方法叫作 setItems(final List itemList, final DiffCallback callback),它接收一個新的類叫作 DiffCallbackDiffCallback 看上去很像 DiffUtil.Callback,只是少了幾個方法。前端

public abstract class DiffCallback<Value> {

   public abstract boolean areItemsTheSame(@NonNull Value oldItem, 
                                           @NonNull Value newItem);

   public abstract boolean areContentsTheSame(@NonNull Value oldItem,
                                              @NonNull Value newItem);

   @SuppressWarnings("WeakerAccess")
   public Object getChangePayload(@NonNull Value oldItem, @NonNull Value newItem) {
       return null;
   }
}
複製代碼

獲取 list 大小的方法不見了!這個 adapter 裏的 setItems() 方法知道舊的數據和新的數據,當 adapter 建立 DiffUtil.Callback 的時候,它重寫了 getOldListSize()getNewListSize() 方法,讓你可以專心比較 list 中數據的異同。java

val diffCallback = object : DiffCallback<DummyItem>() {
    override fun areItemsTheSame(oldItem: DummyItem, 
                                 newItem: DummyItem): Boolean = 
        oldItem.id == newItem.id
    override fun areContentsTheSame(oldItem: DummyItem, 
                                    newItem: DummyItem): Boolean =
        oldItem == newItem
}
itemsAdapter.setItems(randomItems(), diffCallback)
複製代碼

Adapter 刷新 item 而且播放動畫。android

ArrayObjectAdapter 會播放合適的動畫。ios

你不必定要調用帶有 DiffCallback 的 setItems() 方法。若是你不支持 DiffCallback,adapter 會清空當前的 item 而且添加全部新的 item,這可能致使你的內容在屏幕上閃一下。git

這一行裏的內容會在刪除和添加 item 的時候閃動。github

經過查看 setItems() 的源碼,咱們能夠發現 ArrayObjectAdapter 是如何抽象 DiffUtil 裏的樣板方法,給開發者提供一個更整潔的 API。後端

ArrayObjectAdapter 裏面 setItems() 方法的部分源碼。api

若是你想嘗試使用 DiffCallback,能夠從參考這篇 gist 開始。bash

若是你在開發 Android TV 平臺上的應用,我很想了解開發過程當中你最喜歡的是什麼,還有你的痛點是什麼。若是你想繼續這個話題,請在 Twitter 上給我評論或者留言。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索