Intuitive, customizable pagination solution built on lazy lists, automatically managing pagination states during scrolling. Includes error handling, retry, and refresh functionalities, ideal for seamless integration into UI or ViewModel.
More supported composables: PaginatedLazyVerticalGrid and PaginatedLazyHorizontalGrid
State in UI (no ViewModel)
// Int is passed as the KEY which represents your pagination fetching strategy// Int example here means the page number but could really by anything such as a cursor, time, etc...@ComposablefunContent() {
val paginationState = rememberPaginationState<Int, Model>(
initialPageKey = 1,
onRequestPage = { pageKey: Int ->
scope.launch {
try {
val page = DataSource.getPage(pageNumber = pageKey, pageSize = 10)
appendPage(
items = page.items,
nextPageKey = page.nextPageNumber,
isLastPage = page.isLastPage
)
} catch (e: Exception) {
setError(e)
}
}
}
)
// Your paginated composable here
}
State in a ViewModel (Recommended)
classMyViewModel : ViewModel() {
// Int is passed as the KEY which represents your pagination fetching strategy// Int example here means the page number but could really by anything such as a cursor, time, etc...val paginationState = PaginationState<Int, Model>(
initialPageKey = 1,
onRequestPage = { loadPage(it) }
)
funloadPage(pageKey: Int) {
viewModelScope.launch {
try {
val page = DataSource.getPage(pageNumber = pageKey, pageSize = 10)
paginationState.appendPage(
items = page.items,
isLastPage = page.isLastPage
)
} catch (e: Exception) {
paginationState.setError(e)
}
}
}
}
@ComposablefunContent(viewModel: MyViewModel) {
val paginationState = viewModel.paginationState
// Your Paginated composable here
}
Setup
Get the latest version via Maven Central:
(badge may not always be up to date, use the toml declaration for the latest release)
Add Maven Central repository to your root build.gradle at the end of repositories:
It can either be PaginatedLazyColumn or PaginatedLazyRow or PaginatedLazyVerticalGrid or PaginatedLazyHorizontalGrid
@ComposablefunContent() {
val paginationState = ... // either remembered here or in ViewModel// Or any other paginated composable
PaginatedLazyColumn(
paginationState = paginationState,
firstPageProgressIndicator = { ... },
newPageProgressIndicator = { ... },
firstPageErrorIndicator = { e -> ... },
newPageErrorIndicator = { e -> ... },
firstPageEmptyIndicator = { ... },
newPageEmptyIndicator = { ... },
) {
itemsIndexed(
paginationState.allItems!!, // safe to access here
) { _, item ->
Item(value = item)
}
}
}
Retrying your last failed request can be through retryLastFailedRequest
paginationState.retryLastFailedRequest()
Refreshing can be through refresh method
paginationState.refresh(
initialPageKey = 1// optional, defaults to the value provided when creating the state
)
More complex sample can be found in the sample module
Contributing
This library is made to help other developers out in their app developments, feel free to contribute by suggesting ideas and creating issues and PRs that would make this repository more helpful.