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
There are essentially 3 steps.
- Notify when the list is scrolled
- Make REST call (for NEXT page)
- 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
Result:
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"