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.
In my case, this recipeId
data type was long, but when I changed it to string it works fine. Then, instead of NestedScrollView
use SmartNestedScrollview
@Entity(tableName = "table_recipe")
data class RecipeList(
@PrimaryKey
@field:SerializedName("recipe_id") var recipeId : String,
@field:SerializedName("title") var title: String? = null,
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With