Skip to content Skip to sidebar Skip to footer

How To Implement Pagination In Recyclerview On Scroll

Recyclerview comes with its own scroll listener which has the following methods : void onScrollStateChanged(RecyclerView recyclerView, int newState) Callback method to be invoked

Solution 1:

Make Next Call at the end of scroll

enter image description here

There are essentially 3 steps.

  1. Notify when the list is scrolled
  2. Make REST call (for NEXT page)
  3. Add the result in the old list + Notify DataSet change

CALLBACK

But first, we need a Callback which would work as a bridge between RecyclerView.Adapter and Activity

publicinterfacePaginationCallBack{
     publicvoidoadNextPage();
}

Implement this callback in Your Activity

classYourActivityextendsAppCompatActivityimplementsPaginationCallBack{

     intpageNum=1;

     @OverridepublicvoidloadNextPage(){
           // Your implementation
     }
}

Initialize Callback in RecyclerView.Adapter

classYourAdapterextendsRecyclerView.Adapter{

     private PaginationCallBack paginationCallBack;

     publicYourAdapter(PaginationCallBack paginationCallBack) {
        this.paginationCallBack = paginationCallBack;
     }

}

STEP 1 Add a condition in onBindViewHolder method and notify with a Callback.

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewholder, int position) {

    if(position+1==images.size()){
        paginationCallBack.loadNextPage();  // Callback
    }

}

Step 2: Call NEXT Page

getImages(++pageNum) // YOUR REST method which page number

@OverridepublicvoidloadNextPage(){
    getImages(++pageNumber) // REST call with next Page 
}

Step 3 Add the result in old list and notify datasetChanged

publicvoidgetImages(int pageNum){

      List<Images> newResults = //RESTCALL
      imageList.addAll(newResults);
      adapter.updateDataSet(imageList)

}

Where is updateDataSet(imageList) method?

Write this method inside RecyclerView.Adapter

publicvoidupdateDataSet(List<GalleryMedia> newImages){

    if(newImages!=null){
        images = newImages;
    }

    notifyDataSetChanged();
}

Full Code

RecyclerView Pagination

Result:

enter image description here

Solution 2:

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

publicabstractclassHidingScrollListenerextendsRecyclerView.OnScrollListener {

    privatestaticfinalfloatHIDE_THRESHOLD=10;
    privatestaticfinalfloatSHOW_THRESHOLD=70;

    privateintmToolbarOffset=0;
    privatebooleanmControlsVisible=true;
    privateint                 mToolbarHeight;
    privateint                 mTotalScrolledDistance;
    privateintpreviousTotal=0;
    privatebooleanloading=true;
    privateintvisibleThreshold=4;
    int                         firstVisibleItem, visibleItemCount, totalItemCount;
    private LinearLayoutManager layoutManager;

    publicHidingScrollListener(Context context, LinearLayoutManager layoutManager) {
        mToolbarHeight = Tools.getFooterHeight(context);
        this.layoutManager = layoutManager;
    }

    @OverridepublicvoidonScrollStateChanged(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();
                    }
                }
            }
        }

    }

    @OverridepublicvoidonScrolled(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();
        }
    }

    privatevoidclipToolbarOffset() {
        if (mToolbarOffset > mToolbarHeight) {
            mToolbarOffset = mToolbarHeight;
        }
        elseif (mToolbarOffset < 0) {
            mToolbarOffset = 0;
        }
    }

    privatevoidsetVisible() {
        if (mToolbarOffset > 0) {
            onShow();
            mToolbarOffset = 0;
        }
        mControlsVisible = true;
    }

    privatevoidsetInvisible() {
        if (mToolbarOffset < mToolbarHeight) {
            onHide();
            mToolbarOffset = mToolbarHeight;
        }
        mControlsVisible = false;
    }

    publicabstractvoidonMoved(int distance);

    publicabstractvoidonShow();

    publicabstractvoidonHide();

    publicabstractvoidonLoadMore();
}

And it's implementation is below:

HidingScrollListener scrollListener = newHidingScrollListener(activity, manager) {
         @OverridepublicvoidonMoved(int distance) {

         }

         @OverridepublicvoidonShow() {

         }

         @OverridepublicvoidonHide() {

         }

         @OverridepublicvoidonLoadMore() {
            // you can do your pagination here.
         }
      };
      mRecyclerView.addOnScrollListener(scrollListener);

Post a Comment for "How To Implement Pagination In Recyclerview On Scroll"