簡體   English   中英

使用特定頁面索引分頁庫數據源

[英]Paging library data source with specific page index

關於arch中的分頁庫。 組件

它有三種不同的數據源:

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

這看起來很像我在此示例中使用的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<Int, User> 您通過傳遞整數來指定要加載的頁面的位置。 例如,我的load初始方法如下所示:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM