具有特定页面索引的分页库数据源
Paging library data source with specific page index
关于 arch 中的分页库。组件
它有三个不同的数据源:
- PageKeyedDataSource:当请求需要 next/previous 个索引键时。
- ItemKeyedDataSource:当请求需要一个项目作为键时。
- PositionalDataSource:当请求需要索引来获取下一批时。
如果后端响应不支持 next/previous 索引键但仅支持当前页面,则使用哪个。
当响应如下:
{
"status": "success",
"response": "1",
"message": "Data fetched successfully",
"data": {
"total": 2,
"per_page": "5",
"page": 1,
"items": [],
"last_page": 1,
"has_more": false
}
}
这看起来很像我在 sample 中使用的 Whosebug 响应。
{
"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 = "Whosebug"
): Single<SOResponse<User>>
因此我们可以指定页面大小和页数,就像您的情况一样。
为此我使用了 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)
}
如果您检查 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)
关于 arch 中的分页库。组件
它有三个不同的数据源:
- PageKeyedDataSource:当请求需要 next/previous 个索引键时。
- ItemKeyedDataSource:当请求需要一个项目作为键时。
- PositionalDataSource:当请求需要索引来获取下一批时。
如果后端响应不支持 next/previous 索引键但仅支持当前页面,则使用哪个。 当响应如下:
{
"status": "success",
"response": "1",
"message": "Data fetched successfully",
"data": {
"total": 2,
"per_page": "5",
"page": 1,
"items": [],
"last_page": 1,
"has_more": false
}
}
这看起来很像我在 sample 中使用的 Whosebug 响应。
{
"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 = "Whosebug"
): Single<SOResponse<User>>
因此我们可以指定页面大小和页数,就像您的情况一样。
为此我使用了 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)
}
如果您检查 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)