7 bước cài đặt thư viện Paging trong Android

Tram Ho

Gần đây mình có tìm hiểu về thư viện Paging – một phần của Android Jetpack. Mặc dù đã có một số resource về cách triển khai thư viện này trong một ứng dụng, nhưng mình đã phải đối mặt với rất nhiều vấn đề và phải tìm hiểu kỹ hơn về nó. Vì vậy mình nghĩ mình sẽ viết về 7 bước cơ bản để triển khai thư viện Paging trong ứng dụng Android.

Thư viện Paging giúp cho việc tải dữ liệu phân trang trong ứng dụng của bạn dễ dàng hơn. Thư viện Paging cũng hỗ trợ cả list dữ liệu có giới hạn lớn, list dữ liệu không bị ràng buộc (ví dụ như cập nhật liên tục các nguồn cấp dữ liệu). Thư viện phân trang dựa trên ý tưởng gửi list dữ liệu tới giao diện người dùng dưới dạng livedata của list đó và được quan sát bởi RecyclerView.Adapter.

Mình đã lựa chọn xây dựng một ứng dụng cung cấp tin tức để test thư viện Paging. Nào chúng ta quay lại với chủ đề chính thôi, 7 bước để cài đặt thư viện.

I. Thêm thư viện Paging vào trong ứng dụng

II. Cài đặt Retrofit để lấy dữ liệu từ api

Tạo 1 interface **RestApi.java ** :

Sau đó tạo class RestApiFactory.java :

III. Cài đặt DataSource

DataSource – Đây là base class để tải dữ liệu, được sử dụng trong phân trang danh sách. DataSource có thể được triển khai bằng cách sử dụng bất kỳ lớp nào trong 3 lớp sau:

PageKeyedDataSource: Chúng ta có thể sử dụng lớp này nếu chúng ta cần tải dữ liệu dựa trên số lượng trang trong DataSource. Ví dụ chúng ta truyền số trang làm tham số truy vấn trong request, số trang sẽ tăng tuần tự cho đến khi tất cả các trang được lấy về và hiển thị.

ItemKeyedDataSource: Bước đầu tiên là định nghĩa khóa, mục đích là để load dữ liệu ở page kế tiếp dựa trên khóa đó. Ví dụ như data class User thì trường id thường sẽ có key là userId. Kích thức của list là không xác định và việc lấy dữ liệu tiếp theo thường phụ thuộc vào id được biết gần đây nhất. Vì vậy nếu chúng ta lấy dữ liệu các mục từ 1 đến 10 trong kết quả đầu tiên thì ItemKeyedDataSource sẽ tự động lấy dữ liệu tiếp theo từ 11-20.

PositionalDataSource: Lớp này sẽ hữu ích cho các nguồn cung cấp danh sách có kích thước cố định, có thể lấy về với vị trí và kích thước tùy ý.

Trong bài viết này, mình sẽ sử dụng PageKeyedDataSource. Hãy cùng xem đoạn code dưới đây:

IV. Cài đặt DataSourceFactory

DataSourceFactory chịu trách nhiệm truy xuất dữ liệu bằng cách sử dụng config của DataSourcePagedList mà mình sẽ tạo sau ở trong bài viết này trong class ViewModel.

V. Cài đặt lớp ViewModel

ViewModel sẽ chịu trách nhiệm tạo PagedList cùng với các config của nó và gửi đến Activity để Activity có thể quan sát dữ liệu khi dữ liệu thay đổi và chuyển nó đến adapter.

Chắc hẳn mọi người đang thắc mắc vậy PagedList là gì ? PagedList là một danh sách chứa các mục dữ liệu của bạn và gọi DataSource để tải các phần tử. Nó thường bao gồm một công việc thực hiện ở background (tải dữ liệu) và một công việc thực hiện ở foreground (cập nhật UI dựa trên dữ liệu tải về).

Ví dụ: giả sử có một số dữ liệu mà chúng ta thêm vào DataSource trong background thread. DataSource làm mất hiệu lực của PagedList và cập nhật giá trị. Sau đó trên main thread, PagedList sẽ thông báo cho những phần tử observe nó là nó đã có giá trị mới. Bây giờ PagedListAdapter đã biết về giá trị mới.

PageList có 4 tham số mà chúng ta cần chú ý:

a. setEnablePlaceHolder (boolean enablePlaceholders)
b. setInitialLoadSizeHint(int initialLoadSizeHint)
c. setPageSize(int pageSize)
d. setPageSize(int pageSize)

Dưới đây là class ViewModel của project:

VI. Cài đặt PagedListAdapter

PagedListAdapter là một triển khai của RecyclerView. Adapter lấy dữ liệu từ PagedList, nó sử dụng DiffUtil làm tham số để tính toán sự khác biệt dữ liệu và thực hiện tất các các cập nhật cho bạn. DiffUtil được định nghĩa trong Model Class trong trường hợp này:

Class PagedListAdapter :

VII. Cài đặt Activity

Bước cuối cùng là cài đặt class Activity với ViewModel, RecyclerView, PagedListAdapter:

Với bài viết này mình mong mọi người có 1 trải nghiệm tốt và nó sẽ giúp ích cho mọi người. Happy coding ! Thanks for reading.

Tài liệu tham khảo:

https://proandroiddev.com/8-steps-to-implement-paging-library-in-android-d02500f7fffe
https://github.com/anitaa1990/PagingLibrary-Sample

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo