【问题标题】:Paging library data source with specific page index具有特定页面索引的分页库数据源
【发布时间】:2018-06-08 11:16:29
【问题描述】:

关于拱门中的分页库。组件

它有三个不同的数据源:

  1. PageKeyedDataSource:当请求需要下一个/上一个索引键时。
  2. ItemKeyedDataSource:当请求需要项目作为键时。
  3. PositionalDataSource:当请求需要索引来获取下一批时。

如果后端响应不支持下一个/上一个索引键但只支持当前页面,则使用哪个。 当响应如下:

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

【问题讨论】:

  • 你成功了吗@mhdtouban?
  • @levi-albuquerque 您提出的解决方案有效,但是,当我向下滚动等待新数据到来时,我仍然会卡住,我知道分页有助于在到达边界之前获取数据。

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


【解决方案1】:

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

{
  "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>>

所以我们可以指定页面大小和页面数量,就像你的情况一样。

为此,我使用了PageKeyedDataSource&lt;Int, User&gt;。通过传递一个整数来指定要加载的页面。例如,我的加载初始方法如下所示:

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)
    }

如果您检查callback.onResult(it.items, 1, 2),您会看到我正在请求下一页,即 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)
    }

这次我只是增加页码callback.onResult(it.items, params.key + 1)

【讨论】:

  • 如果网址中没有@Query("page") page: Int怎么办?@LeviMoreira
猜你喜欢
  • 1970-01-01
  • 2016-09-01
  • 2010-12-14
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多