Как Android Paging Library знает, как загрузить больше данных? - PullRequest
0 голосов
/ 05 июля 2018

Я довольно новичок в разработке приложений для Android и пытаюсь сделать все «правильно». Итак, сейчас я внедряю новую библиотеку подкачки Android в свой проект, где мне нужно загрузить список статей с сетевого сервера. .

У меня есть класс ArticlesRepository, который возвращает класс ArticleList, содержащий экземпляры ArticleListItem, которые я хотел бы отобразить в RecyclerView. Список статей разбит на страницы уже на сервере, поэтому хранилище отправляет запрос на первую страницу и возвращает ArticleList со свойством page, установленным на 1, и свойством articles, содержащим List<ArticleListItem> статьи на запрашиваемой странице. Я не знаю, сколько статей может быть на одной странице.

Теперь я смог реализовать PageKeyedDataSource<Integer, ArticleListItem>, но он выбирает только первую страницу:

@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, ArticleListItem> callback) {
    ArticleList list = load(1);
    if (list != null) {
        callback.onResult(list.articles, null, next(list));
    }
}

@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, ArticleListItem> callback) {
    ArticleList list = load(previous(params.key));
    if (list != null) {
        callback.onResult(list.articles, previous(list));
    }
}

@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, ArticleListItem> callback) {
    ArticleList list = load(next(params.key));
    if (list != null) {
        callback.onResult(list.articles, next(list));
    }
}

Функции previous / next возвращают Integer с номером предыдущей / следующей страницы или null, если его нет.

В моей ViewModel я настраиваю PagedList следующим образом:

PagedList.Config config = new PagedList.Config.Builder()
            .setEnablePlaceholders(false)
            .setInitialLoadSizeHint(1)
            .setPageSize(1)
            .setPrefetchDistance(1)
            .build();

Таким образом, я могу загрузить первую страницу, но когда я прокручиваю до конца RecyclerView (который находится внутри NestedScrollView), ничего не происходит. Отладка показывает, что метод PageKeyedDataSource.loadAfter не вызывается.

Должен ли я как-то сообщить PagedList, что должна быть загружена следующая страница, или это работа RecyclerView / DataSource / GodKnowsWhatElse, и я просто что-то делаю не так? Спасибо за любой совет.

1 Ответ

0 голосов
/ 05 июля 2018

Библиотека подкачки должна автоматически знать, когда загружать новые элементы. Проблема в вашей реализации заключается в том, что постраничный RecyclerView находится внутри NestedScrollView, и в соответствии с этой проблемой библиотека не имеет встроенной поддержки для этого.

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

Вам нужно будет создать собственную реализацию Nested Scroll View, на самом деле в этой gist есть такая, которая может вам помочь.

Также предлагается добавить fillViewPort к этому пользовательскому вложенному представлению прокрутки:

android: fillViewport = "true" для прокручиваемого контейнера

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