Shift Delete
Shift Delete

Reputation: 1054

Android Paging (3) load all pages at once

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

Answers (2)

Muhammad Abolmaaty
Muhammad Abolmaaty

Reputation: 11

If Your RecyclerView has wrap content for height change it to match parent or 0dp

Upvotes: 1

mohammadjan naser
mohammadjan naser

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

Related Questions