I'm using the Android Paging 3 library in my project in order to load my data page by page. In this project, I'm not using database which means I'm using network only requests
. The problem is that instead of loading pages based on the user scroll, it loads all pages at first. here is the code I'm using for the paging part of my project:
My RxPagingSource class:
class ReviewPagingSource constructor(
private val network: Network,
private val filter: ReviewFilter,
private val config: Config,
private val cacheFirstResponse: Boolean
) : RxPagingSource<Int, Review>() {
override fun loadSingle(params: LoadParams<Int>): Single<LoadResult<Int, Review>> {
return network.getReviews(
filter.copy(page = (params.key ?: 0) , pageSize = params.loadSize),
config,
cacheFirstResponse
)
.subscribeOn(Schedulers.io())
.map { toLoadResultPage(it, params) }
.onErrorResumeNext {
when (it) {
is TimeoutException,
is NoInternetException, is NetworkException, is UnexpectedResponseException -> Single.just(
LoadResult.Error(it)
)
else -> Single.error(it)
}
}
}
private fun toLoadResultPage(
response: DataResponse<Review>,
params: LoadParams<Int>
): LoadResult<Int, Review> {
val page = params.key ?: 0
return LoadResult.Page(
response.results!!,
if (page <= 0) null else page - 1,
if (response.count ?: response.results?.count() ?: 0 < params.loadSize) null else page + 1,
LoadResult.Page.COUNT_UNDEFINED,
LoadResult.Page.COUNT_UNDEFINED
)
}
override fun getRefreshKey(state: PagingState<Int, Review>): Int? {
return state.anchorPosition?.let { state.closestPageToPosition(it) }?.nextKey
}
}
My Pager is:
Pager(PagingConfig(pageSize = 5, initialLoadSize = 5,))
{ ReviewPagingSource(network, filter, config, true) }
.flow.cachedIn(viewModelScope)
Related Gradle Part:
implementation "androidx.paging:paging-runtime-ktx:3.0.0-alpha13"
implementation "androidx.paging:paging-rxjava3:3.0.0-alpha13"
Any help would be appreciated.