48. Paging的使用

1.確保使用的RecyclerView是androidx.recyclerview.widget.RecyclerView
2.給RecyclerView設置的Adapter不再是RecyclerView.Adapter而是PagedListAdapter
3.在Adapter初始化的時候,傳入一個ItemCallback,用於判斷item是否是同一個,注意Student要實現equals 和 hashCode兩個方法用於比較

     protected MyPageListAdapter() {
        super(new DiffUtil.ItemCallback<Student>() {
            @Override
            public boolean areItemsTheSame(@NonNull Student oldItem, @NonNull Student newItem) {
                Log.d("MyPageListAdapter", "areItemsTheSame oldItem.getId() = " + oldItem.getId() + " newItem.getId() = " + newItem.getId());
                return oldItem.getId() == newItem.getId();
            }

            @Override
            public boolean areContentsTheSame(@NonNull Student oldItem, @NonNull Student newItem) {
                Log.d("MyPageListAdapter", "areContentsTheSame oldItem = " + oldItem + " newItem = " + newItem);
                return oldItem.equals(newItem);
            }
        });
    }

4.Adapter需要的數據源由LivePagedListBuilder類提供

        pagedListLiveData = new LivePagedListBuilder(new DataSource.Factory() {
            @NonNull
            @Override
            public DataSource create() {
                return new PositionalDataSource() {
                    @Override
                    public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback callback) {
                        Log.d("StudentViewModel", "loadInitial params = " + params.pageSize + " start position = " + params.requestedStartPosition);
                        callback.onResult(getStudents(0, 20), 0, 1000);
                    }

                    @Override
                    public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback callback) {
                        Log.d("StudentViewModel", "loadRange params = " + params.loadSize + " start position = " + params.startPosition);
                        callback.onResult(getStudents(params.startPosition, params.loadSize));
                    }
                };
            }
        }, 20).build();

5.LivePagedListBuilder build出來的是一種LiveData<PagedList<Value>>類型的數據,通過監聽數據的變化來更新adapter

       pagedListLiveData.observe(this, new Observer<PagedList<Student>>() {
            @Override
            public void onChanged(PagedList<Student> students) {
                adapter.submitList(students);
            }
        });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章