+4

Android TV: Sử dụng DiffCallback của Leanback

Khác biệt giữa DiffCallback và DiffUtil.Callback

Một class được gọi là DiffUtil đã được giới thiệu trong version 24.2 của thư viện hỗ trợ dùng để update RecyclerView.Adapter. Trong version 27.0 của thư viện hỗ trợ leanback, thằng này được thêm vào để support cho ArrayObjectAdapter. ArrayObjectAdapter có 1 method mới được gọi là setItems(final List itemList, final DiffCallback callback) cho phép truyền vào 1 đối số là một DiffCallback. DiffCallback cũng giống như DiffUtil.Calbback ngoại trừ việc nó ít method hơn so với thằng kia.

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

Các phương thức về size của một list hầu như biến mất hoàn toàn. Và hàm setItems() trong adapter sẽ biết về các old và new item, nó sẽ override lại 2 hàm getOldListSize() và getNewListSize() cho phép chúng ta tiến hành tập trung vào việc so sánh các item trong list.

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)

Sau đó adapter sẽ update các item và đi kèm với các animation phù hợp.

Chúng ta không nên gọi hàm setItems() mà không có 1DiffCallback. Bởi vì nếu chúng ta không cung cấp thằng này thì adapter nó sẽ clear sạch tất cả các item hiện tại và add toàn bộ các item mới. Điều này sẽ dẫn đến màn hình hiển thị của chúng ta nó sẽ bị nhấp nháy như dưới đây.

Nhìn vào code của hàm setItems() này chúng ta có thể thấy được cách mà thằng ArrayObjectAdapter nó tiến xử lý mới từ code có sắn của thằng DiffUtil - đưa cho các lập trình viên chúng ta 1 api nhìn clean hơn.

Một phần source code của hàm setItems() trong ArrayObjectAdapter

Tổng kết

Dưới đây mình đã giới thiệu cho các bạn về việc sử dụng DiffCallback, nếu có gì sai xót mong nhận được sự góp y


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí