RecyclerView Endless Scroll не прокручивается - PullRequest
0 голосов
/ 25 августа 2018

Я изучал бесконечную прокрутку с помощью RecyclerView. Я определил услугу следующим образом:

@GET("discover/movie")
Observable<MovieResponse> discoverMovies(@Query("page") int page);

Как видите, он принимает параметр запроса типа int. Ниже представлен мой фрагментный класс, где я делаю запрос на обслуживание, используя Retrofit2 Observable.

public class MoviesFragment extends Fragment {

    private static final int COLUMN_COUNT = 2;
    private MoviesGridAdapter adapter;
    private MovieService service;
    private CompositeDisposable disposable = new CompositeDisposable();
    private int pageNum = 1;
    private GridLayoutManager layoutManager;
    private RecyclerView recyclerView;

    public MoviesFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        service = ServiceFactory.createService(MovieService.class);
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.movies_fragment_container, container, false);
        recyclerView = view.findViewById(R.id.movies_recycler_view);
        pageLoader = view.findViewById(R.id.movies_page_loader);
        layoutManager = new GridLayoutManager(getContext(), COLUMN_COUNT);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        loadmore();
        return view;
    }

    private void loadmore() {
        recyclerView.addOnScrollListener(new EndlessRecyclerView(layoutManager) {
            @Override
            public void onLoadMore(int totalItemsCount, RecyclerView view) {
                pageNum++;
                parseMovie(pageNum);
            }
        });
    }

    private void parseMovie(int page) {
        service.discoverMovies(page)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new DisposableObserver<MovieResponse>() {
                               @Override
                               public void onNext(MovieResponse moviesResponse) {
                                   adapter = new MoviesGridAdapter(getContext(), moviesResponse);
                                   recyclerView.setAdapter(adapter);
                                   adapter.notifyDataSetChanged();
                               }

                               @Override
                               public void onError(Throwable e) {
                                   errorDialog();
                               }

                               @Override
                               public void onComplete() {

                               }
                           }
                );
    }

    @Override
    public void onResume() {
        super.onResume();
        moviesSubscription(1);
    }

}

Когда я пытаюсь прокрутить, происходит загрузка второй страницы (или страницы 2). Но я застреваю на второй странице. Я не могу прокрутить вверх или вниз оттуда. Я знаю, что где-то упускаю кусок или делаю совершенно неправильно.

public abstract class EndlessRecyclerView extends RecyclerView.OnScrollListener {
    private int visibleThreshold = 2;
    private int previousTotalItemCount = 0;
    private boolean loading = true;

    private RecyclerView.LayoutManager mLayoutManager;

    public EndlessRecyclerView(LinearLayoutManager layoutManager) {
        this.mLayoutManager = layoutManager;
    }

    public EndlessRecyclerView(GridLayoutManager layoutManager) {
        this.mLayoutManager = layoutManager;
        visibleThreshold = visibleThreshold * layoutManager.getSpanCount();
    }

    public EndlessRecyclerView(StaggeredGridLayoutManager layoutManager) {
        this.mLayoutManager = layoutManager;
        visibleThreshold = visibleThreshold * layoutManager.getSpanCount();
    }

    public int getLastVisibleItem(int[] lastVisibleItemPositions) {
        int maxSize = 0;
        for (int i = 0; i < lastVisibleItemPositions.length; i++) {
            if (i == 0) {
                maxSize = lastVisibleItemPositions[i];
            } else if (lastVisibleItemPositions[i] > maxSize) {
                maxSize = lastVisibleItemPositions[i];
            }
        }
        return maxSize;
    }

    @Override
    public void onScrolled(RecyclerView view, int dx, int dy) {
        int totalItemCount = mLayoutManager.getItemCount();
        int lastVisibleItemPosition = 0;

        if (mLayoutManager instanceof StaggeredGridLayoutManager) {
            int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) mLayoutManager).findLastVisibleItemPositions(null);
            lastVisibleItemPosition = getLastVisibleItem(lastVisibleItemPositions);
        } else if (mLayoutManager instanceof GridLayoutManager) {
            lastVisibleItemPosition = ((GridLayoutManager) mLayoutManager).findLastVisibleItemPosition();
        } else if (mLayoutManager instanceof LinearLayoutManager) {
            lastVisibleItemPosition = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition();
        }

        if (totalItemCount < previousTotalItemCount) {
            this.previousTotalItemCount = totalItemCount;
            if (totalItemCount == 0) {
                this.loading = true;
            }
        }

        if (loading && (totalItemCount > previousTotalItemCount)) {
            loading = false;
            previousTotalItemCount = totalItemCount;
        if (!loading && (lastVisibleItemPosition + visibleThreshold) > totalItemCount
                && view.getAdapter().getItemCount() > visibleThreshold) {
            onLoadMore(totalItemCount, view);
            loading = true;
        }
    }

    public void resetState() {
        this.previousTotalItemCount = 0;
        this.loading = true;
    }

    public boolean isLoading() {
        return loading;
    }

    public void setLoading(boolean loading) {
        this.loading = loading;
    }

    public int getFirstCompletelyVisibleItemPosition() {
        return ((GridLayoutManager) mLayoutManager).findFirstCompletelyVisibleItemPosition();
    }

    public abstract void onLoadMore(int totalItemsCount, RecyclerView view);
}

Это бесконечный слушатель представления переработчика, который я сейчас использую в своем проекте.

Вопрос: Как я могу добиться бесконечной прокрутки, используя RecyclerView для нумерации страниц?

Я также пытался использовать flatMap, но я не смог этого добиться. Я был бы рад получить ваше мнение о том, как использовать flatMap или RecyclerView addOnScrollListener для достижения бесконечной прокрутки. Я ищу, чтобы прокрутить до максимального номера страницы (используя что-то строку Inter.MAX_VALUE).

Спасибо

1 Ответ

0 голосов
/ 25 августа 2018

сэкономьте ваше время и используйте эту библиотеку для реализации нумерации страниц

https://github.com/MarkoMilos/Paginate

...