やってみる。扱うデータ量が多いので、無限ということにした。Pageの数制限してもいいかも。またリストの一番下に付いたら次のページをロードするのでは遅く感じるので、下の近くにきたらロードにしてみる。
// ScrollPagerListener.java public abstract class ScrollPagerListener extends RecyclerView.OnScrollListener { GridLayoutManager mLayoutManager; int mPage = 1; int mCount, mPreTotalCount; boolean mIsLoading; public ScrollPagerListener(GridLayoutManager layoutManager, int count) { mLayoutManager = layoutManager; mCount = count; } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); // ロードするときに走るのは無駄なので、先にreturnする if (dx == 0 && dy == 0) { return; } int totalItemCount = mLayoutManager.getItemCount(); int lastVisibleItem = mLayoutManager.findLastVisibleItemPosition() + 1; // 前回スクロールした時よりアイテム数に変化があれば更新が終わった事とする if (totalItemCount != mPreTotalCount) { mIsLoading = false; } mPreTotalCount = totalItemCount; // load()が走るべき箇所までスクロールしたか int loadLine = totalItemCount - mCount; if (lastVisibleItem >= loadLine && !mIsLoading) { mIsLoading = true; load(++mPage); } } public abstract void load(int page); } // HogeFragment.java View onCreateView(...) { mRecyclerView.addOnScrollListener(new ScrollPagerListener(layoutManager, 10) { @Override public void load(int page) { mPresenter.showCategoryProducts(page); } }); }
ちゃんとテスト書いてないから不安だけど、それっぽく動いてるように見える。