Какова лучшая практика разбиения на страницы приложения в RxJava? - PullRequest
0 голосов
/ 04 мая 2018

Скажем, мы получили API пагинации Single<List<Foo>> getFoos(pageToken: String?) и используем RxBinding для просмотра событий прокрутки RecyclerView RxRecyclerView.scrollEvents(recyclerView). Насколько я могу себе представить, это реализовать оператор, который преобразует событие прокрутки в pageToken. Таким образом, текущие события прокрутки зависят от результата API. Должен ли я реализовать это рекурсивным способом или есть какой-нибудь элегантный способ?

1 Ответ

0 голосов
/ 12 мая 2018

Если вы хотите использовать разбиение на страницы с rxJava, нет необходимости использовать rxBinding Вы можете сделать rxjava-нумерацию самостоятельно:

 private Observable<Integer> getScrollObservable(RecyclerView recyclerView, int limit, int emptyListCount) {
        return Observable.create(subscriber -> {
            final RecyclerView.OnScrollListener sl = new RecyclerView.OnScrollListener() {
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    if (!subscriber.isUnsubscribed()) {
                        int position = getLastVisibleItemPosition(recyclerView);
                        int updatePosition = recyclerView.getAdapter().getItemCount() - 1 - (limit / 2);
                        if (position >= updatePosition) {
                            int offset = emptyListCountPlusToOffset ? recyclerView.getAdapter().getItemCount() : recyclerView.getAdapter().getItemCount() - emptyListCount;
                            subscriber.onNext(offset);
                        }
                    }
                }
            };
            recyclerView.addOnScrollListener(sl);
            subscriber.add(Subscriptions.create(() -> recyclerView.removeOnScrollListener(sl)));
            if (recyclerView.getAdapter().getItemCount() == emptyListCount) {
                int offset = emptyListCountPlusToOffset ? recyclerView.getAdapter().getItemCount() : recyclerView.getAdapter().getItemCount() - emptyListCount;
                subscriber.onNext(offset);
            }
        });
    }

см. Полный пример

...