How to implement pagination in RecyclerView on scroll

前端 未结 2 746
礼貌的吻别
礼貌的吻别 2021-01-22 06:13

Recyclerview comes with its own scroll listener which has the following methods :

void onScrollStateChanged(RecyclerView recyclerView, int newState)         


        
2条回答
  •  心在旅途
    2021-01-22 06:49

    Here's a scroll listener which implements load more and quick return pattern:

    public abstract class HidingScrollListener extends RecyclerView.OnScrollListener {
    
        private static final float  HIDE_THRESHOLD   = 10;
        private static final float  SHOW_THRESHOLD   = 70;
    
        private int                 mToolbarOffset   = 0;
        private boolean             mControlsVisible = true;
        private int                 mToolbarHeight;
        private int                 mTotalScrolledDistance;
        private int                 previousTotal    = 0;
        private boolean             loading          = true;
        private int                 visibleThreshold = 4;
        int                         firstVisibleItem, visibleItemCount, totalItemCount;
        private LinearLayoutManager layoutManager;
    
        public HidingScrollListener(Context context, LinearLayoutManager layoutManager) {
            mToolbarHeight = Tools.getFooterHeight(context);
            this.layoutManager = layoutManager;
        }
    
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
    
            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                if (mTotalScrolledDistance < mToolbarHeight) {
                    setVisible();
                }
                else {
                    if (mControlsVisible) {
                        if (mToolbarOffset > HIDE_THRESHOLD) {
                            setInvisible();
                        }
                        else {
                            setVisible();
                        }
                    }
                    else {
                        if ((mToolbarHeight - mToolbarOffset) > SHOW_THRESHOLD) {
                            setVisible();
                        }
                        else {
                            setInvisible();
                        }
                    }
                }
            }
    
        }
    
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
    
            clipToolbarOffset();
            onMoved(mToolbarOffset);
    
            if ((mToolbarOffset < mToolbarHeight && dy > 0) || (mToolbarOffset > 0 && dy < 0)) {
                mToolbarOffset += dy;
            }
            if (mTotalScrolledDistance < 0) {
                mTotalScrolledDistance = 0;
            }
            else {
                mTotalScrolledDistance += dy;
            }
            // for load more
            visibleItemCount = recyclerView.getChildCount();
            totalItemCount = layoutManager.getItemCount();
            firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
    
            if (loading) {
                if (totalItemCount > previousTotal) {
                    loading = false;
                    previousTotal = totalItemCount;
                }
            }
            if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
                // End has been reached
                // Do something
    
                loading = true;
                onLoadMore();
            }
        }
    
        private void clipToolbarOffset() {
            if (mToolbarOffset > mToolbarHeight) {
                mToolbarOffset = mToolbarHeight;
            }
            else if (mToolbarOffset < 0) {
                mToolbarOffset = 0;
            }
        }
    
        private void setVisible() {
            if (mToolbarOffset > 0) {
                onShow();
                mToolbarOffset = 0;
            }
            mControlsVisible = true;
        }
    
        private void setInvisible() {
            if (mToolbarOffset < mToolbarHeight) {
                onHide();
                mToolbarOffset = mToolbarHeight;
            }
            mControlsVisible = false;
        }
    
        public abstract void onMoved(int distance);
    
        public abstract void onShow();
    
        public abstract void onHide();
    
        public abstract void onLoadMore();
    }
    

    And it's implementation is below:

    HidingScrollListener scrollListener = new HidingScrollListener(activity, manager) {
             @Override
             public void onMoved(int distance) {
    
             }
    
             @Override
             public void onShow() {
    
             }
    
             @Override
             public void onHide() {
    
             }
    
             @Override
             public void onLoadMore() {
                // you can do your pagination here.
             }
          };
          mRecyclerView.addOnScrollListener(scrollListener);
    

提交回复
热议问题