使用特定页面索引分页库数据源

时间:2018-06-08 11:16:30

标签: android paging android-architecture-components android-jetpack androidx

关于arch中的分页库。部件

它有三种不同的数据源:

  1. PageKeyedDataSource:当请求需要下一个/上一个索引键时。
  2. ItemKeyedDataSource:当请求需要项目作为键时。
  3. PositionalDataSource:当请求需要索引来获取下一批时。
  4. 如果后端响应不支持下一个/上一个索引键但只支持当前页面,则使用哪一个。 当答复如下:

    {
        "status": "success",
        "response": "1",
        "message": "Data fetched successfully",
        "data": {
            "total": 2,
            "per_page": "5",
            "page": 1,
            "items": [],
            "last_page": 1,
            "has_more": false
        }
    }
    

1 个答案:

答案 0 :(得分:3)

这看起来很像我在sample中使用的StackOverflow响应。

border: none;

我使用的改装界面如下所示:

{
  "items": [
  ],
  "has_more": true,
  "quota_max": 10000,
  "quota_remaining": 9965
}

因此,我们可以指定页面大小和页面数量,例如您的情况。

为此,我使用了@Headers("Content-Type: application/json", "Accept: application/json") @GET("/2.2/users") fun getTopUsers( @Query("page") page: Int, @Query("pagesize") pagesize: Int, @Query("order") order: String = "desc", @Query("sort") sort: String = "reputation", @Query("site") site: String = "stackoverflow" ): Single<SOResponse<User>> 。您通过传递整数来指定要加载的页面的位置。例如,我的load initial方法如下所示:

PageKeyedDataSource<Int, User>

如果您查看override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, User>) { loadState.onNext(NetworkState.LOADING) val disposable = soApi.apiService.getTopUsers(1, params.requestedLoadSize) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.onResult(it.items, 1, 2) loadState.onNext(NetworkState.LOADED) }, { loadState.onNext(NetworkState.error(it.message)) }) disposables.add(disposable) } ,我会看到我要求下一页,即2页。

对于其他页面,我使用了这个:

callback.onResult(it.items, 1, 2)

这次我只是递增页码override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, User>) { loadState.onNext(NetworkState.LOADING) val disposable = soApi.apiService.getTopUsers(params.key, params.requestedLoadSize) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ callback.onResult(it.items, params.key + 1) loadState.onNext(NetworkState.LOADED) }, { loadState.onNext(NetworkState.error(it.message)) }) disposables.add(disposable) }