Я изучал бесконечную прокрутку с помощью 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).
Спасибо