Xây dựng code base cho load more & refresh list với jetpack paging lib

Tram Ho

Mở đầu

Việc load list dữ liệu có load more và refresh là một task rất hay gặp trong quá trình dev android, hôm nay mình giới thiệu với các bạn cách thực hiện nó với jetpack paging lib và tạo base để sử dụng lại cho các màn khác nhau.

Tiến hành code base

PagedListAdapter

Để paging lib có thể detect việc load more thì chúng ta cần sử dụng PagedListAdapter, các bạn có thể tạo một adapter hoặc extend từ BasePagedListAdapter bên dưới.

Lưu ý: paging lib sử dụng hàm getItem() để detect việc load more nên các bạn cần gọi hàm này trong onBindViewHolder(), nếu các bạn sử dụng cách khác để get item, ví dụ adapter.currentList.getPosition thì paging lib sẽ không thể detect được việc load more list.

https://github.com/dangquanuet/The-Movie-DB-Kotlin/blob/develop/app/src/main/java/com/example/moviedb/ui/base/BaseListAdapter.kt#L80

BasePageKeyedDataSource

Paging lib hiện tại hỗ trợ 3 loại data srouce khác nhau, nhưng PageKeyedDataSource là loại hay được dùng nhất nên mình sẽ làm ví dụ cho loại này, 2 loại còn lại các bạn có thể làm tương tự nhé.

Hiện tại PageKeyedDataSource có 3 hàm loadInitial(), loadBefore(), loadAfter() để định nghĩa cho các trạng thái load dữ liệu theo page nhưng thực tế mình thấy là chúng ta hoàn toàn chỉ cần một hàm load nên mình đã code gọn lại và đưa về 1 hàm abstract loadDataSource() duy nhất.

Lưu ý: Theo như mình được biết thì paging 3 (hiện đang là preview) đã gộp các hàm trên lại thành 1, thực sự rất là hơp lý. Mình sẽ giới thiệu tới các bạn sau khi nó đã ổn định hơn.

https://github.com/dangquanuet/The-Movie-DB-Kotlin/blob/develop/app/src/main/java/com/example/moviedb/ui/base/BasePagedRefreshViewModel.kt#L123

BasePagedRefreshViewModel

Sau khi có data source thì chúng ta sẽ định nghĩa viewmodel, viewmodel sẽ có các phần logic cơ bản của load more, refresh, config thông số cho PageKeyedDataSource và một hàm loadData() để get dữ liệu

https://github.com/dangquanuet/The-Movie-DB-Kotlin/blob/develop/app/src/main/java/com/example/moviedb/ui/base/BasePagedRefreshViewModel.kt#L14

BasePagedRefreshFragment

Base code fragment cho màn hình sử dụng BasePagedRefreshViewModel để chúng ta có thể dùng lại cho các màn hình khác nhau mà có chùng cơ chế.

https://github.com/dangquanuet/The-Movie-DB-Kotlin/blob/develop/app/src/main/java/com/example/moviedb/ui/base/BasePagedRefreshFragment.kt#L11

Sử dụng

PagedMovieAdapter

https://github.com/dangquanuet/The-Movie-DB-Kotlin/blob/develop/app/src/main/java/com/example/moviedb/ui/screen/paged/PagedMovieAdapter.kt#L10

PagedMovieFragment

https://github.com/dangquanuet/The-Movie-DB-Kotlin/blob/develop/app/src/main/java/com/example/moviedb/ui/screen/paged/PagedMovieFragment.kt#L13

PagedMovieViewModel

https://github.com/dangquanuet/The-Movie-DB-Kotlin/blob/develop/app/src/main/java/com/example/moviedb/ui/screen/paged/PagedMovieViewModel.kt

Kết

Bạn thấy đấy, với việc sử dụng base code thì giờ đây việc làm những màn hình có load more refresh trở nên nhanh chóng và tiện lợi hơn rất nhiều, chúng ta dễ dàng sử dụng cho các màn khác nhau có cấu trúc tương tự.

Các bạn có thể tham khảo full source code ở ddaay: https://github.com/dangquanuet/The-Movie-DB-Kotlin

Hẹn gặp lại các bạn trong các bài tiếp theo.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo