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
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:
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
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
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
Transform pager
Thực hiện các phép biến đổi trên dữ liệu Flow của pager trả về
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
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
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
UI Example