パルカワ2

PerlとRubyとイチャラブ

RecyclerViewでスクロールすると次のページを取得する

やってみる。扱うデータ量が多いので、無限ということにした。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);
        }
    });
}

ちゃんとテスト書いてないから不安だけど、それっぽく動いてるように見える。