Reputation: 1054
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.
Upvotes: 9
Views: 5920
Reputation: 11
If Your RecyclerView has wrap content for height change it to match parent or 0dp
Upvotes: 1
Reputation: 93
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,
)
Upvotes: 2