Источник данных библиотеки подкачки с определенным индексом страницы - PullRequest
0 голосов
/ 08 июня 2018

По поводу подкачки библиотеки в арке.компоненты

Имеет три различных источника данных:

  1. PageKeyedDataSource: когда для запроса требуются следующие / предыдущие ключи индекса.
  2. ItemKeyedDataSource: когда для запроса требуется элемент в качествеkey.
  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
    }
}

1 Ответ

0 голосов
/ 08 июня 2018

Это очень похоже на ответ 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>.Где вы указываете страницу, которую вы хотите загрузить, передавая целое число.Например, мой начальный метод загрузки выглядит следующим образом:

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...