Giới thiệu Paging library

Paging library giúp bạn tải và hiển thị các trang dữ liệu của một tập dữ liệu lớn hơn từ bộ nhớ cục bộ hoặc qua mạng. Phương pháp này cho phép ứng dụng sử dụng cả băng thông mạng và tài nguyên hệ thống một cách hiệu quả hơn. Các thành phần của thư viện Paging được thiết kế để phù hợp với cấu trúc ứng dụng Android được đề xuất, tích hợp mượt mà với các thành phần khác của Jetpack và cung cấp khả năng hỗ trợ Kotlin hàng đầu..

Lợi ích Paging library

  • Tránh lặp dữ liệu
  • Sử dụng dữ liệu cả ở cục bộ và network đem lại hiệu năng và trải nghiệm tốt hơn
  • Tự động load dữ liệu mới khi người dùng scroll
  • Cung cấp các cấu hình PageSize, InitialSize, PreLoad
  • Support tốt với Flow, LiveData và RxJava
  • Cung cấp các chức năng Error Handle, Refresh, Retry, Jump ThresHold, Placeholder

Hạn chế Paging library

  • Không linh hoạt trong chỉnh sửa dữ liệu đầu vào
  • Không linh hoạt trong việc cập nhật dữ liệu
  • Chưa hỗ trợ tốt cho filter, sort, transform dữ liệu

Thích hợp với

  • Danh sách dữ liệu lớn
  • Dữ liệu đầu vào nên là bất biến
  • Không yêu cầu các chức năng truy vấn dữ liệu phức tạp trên dữ liệu

Setup

image

Cấu trúc thư viện

Các thành phần của thư viện Paging hoạt động trong 3 lớp của ứng dụng:

image

PagingSource Example

Là class quản lý các hành vi truy vấn dữ liệu từ network và trả về cho Pager

image

image

Remote Mediator Example 

Là class quản lý các hành vi truy vấn dữ liệu từ network và nạp vào cơ sở dữ liệu RoomDataBase

image

image

image

Pager Example 

Là class để cấu hình các loại dữ liệu như PageSize, InitialSize, PreSize,… và trả về Flow PagingData cho UI

image

image

Transform pager

Thực hiện các phép biến đổi trên dữ liệu Flow của pager trả về

image

image

image

PagingDataAdapter Example

Tương tự như các adapter khác của recyclerView nhưng có thể xác định event scroll của người dùng để tự động gọi event load data.

PagingDataAdapter nhận giá trị đầu vào là 1 DiffUitl dùng để phân biệt thay đổi dữ liệu của item sau đó tiến hành vẽ lại view qua onBindViewHolder

image

image

LoadStateAdapter  Example

Paging trả về các giá trị của flow hiện tại như 

LoadState.Loading: Đang thực hiện truy vấn 

LoadState.Error: Truy vấn thất bại

LoadState.NotLoading: Không thực hiện truy vấn

Dựa vào các giá trị đó thực hiện custom các layout tương ứng với từng giá trị đó để có thể hiển thị trên giao diện

image

image

LoadStateAdapter là 1 adapter có thể zip với PagingDataAdapter hiển thị các giao diện tương ứng với các LoadState của flow ở các vị trí như 

  • Header
  • Footer

image

UI Example 

image