Pagination not work for the RecyclerView within NestedScrollView
Follow this steps :
1. Set nested scrolling enabled false of recycler view.
recyclerView.setNestedScrollingEnabled(false);
2. Add scroll listner to nested scrollview.
mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged()
{
View view = (View)mScrollView.getChildAt(mScrollView.getChildCount() - 1);
int diff = (view.getBottom() - (mScrollView.getHeight() + mScrollView
.getScrollY()));
if (diff == 0) {
// your pagination code
}
}
});
Pagination with RecyclerView within NestedScrollView
to solve this challenge I perform the following Steps:
1- for XML file or EndlessRecyclerViewScrollListener NO CHANGES
2- for my activity I delete EndlessRecyclerViewScrollListener for vertical Recycler and defined my NestedScrollListener instance then set OnScrollChangeListener as below:
boolean loading = true;
int pageNumber = 1;
NestedScrollView scroller = findViewById(R.id.nestedScroll);
if (scroller != null) {
scroller.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
if (scrollY > oldScrollY) {
Log.i(TAG, "Scroll DOWN");
}
if (scrollY < oldScrollY) {
Log.i(TAG, "Scroll UP");
}
if (scrollY == 0) {
Log.i(TAG, "TOP SCROLL");
}
if (scrollY == ( v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight() )) {
Log.i(TAG, "BOTTOM SCROLL");
// here where the trick is going
if (loading){
pageNumber++;
showProgressView(mixedProgressBar);
// calling from adapter addToExistingList(list)
// with the defined Adapter instance
verticalAdapter.addToExistingList(getPosts(pageNumber));
// reset the boolean(loading) to prevent
// auto loading data from APi
loading = false;
}
}
});
}
3- for VerticalAdapter, I add the following method :
public void addToExistingList(List<DataModel> dataModelList){
// update oldDataModelList with newer data from pagination
oldDataModelList.retainAll(dataModelList);
notifyItemRangeChanged(oldDataModelList.size()-1 , dataModelList.size());
}
4- for getPosts(pageNumber) on fetching data success re-assign the boolean(loading)
getPosts(pageNumber) is a method to invoke data from API
JsonArrayRequest arrayRequest = new JsonArrayRequest(Request.Method.GET,baseAPI,
response1 -> {
try {
// doing stuff to invoke your data
// re-assign loading variable to load again
loading = true;
} catch (JSONException e) {
e.printStackTrace();
}
Related Topics
Where Do I Create and Use Scheduledthreadpoolexecutor, Timertask, or Handler
Android - How to Get Application Name? (Not Package Name)
How to Hide Android Soft Keyboard on Edittext
I Want My Recyclerview to Not Recycle Some Items
How to Write a Custom Filter for Listview with Arrayadapter
Exporting SQLite Database to CSV File in Android
How Can Write Code to Make Sharedpreferences for Array in Android
How to Get Number of Lines of Textview
Adding Fling Gesture to an Image View - Android
How to Highlight the Selected Item of Recycler View
Surfaceview Flashes Black on Load
Developing an Android Homescreen
Adding Content to a Linear Layout Dynamically
How to Finish Current Activity in Android
Animate Progressbar Update in Android
Android Scale Animation on View
[Install_Failed_No_Matching_Abis: Failed to Extract Native Libraries, Res=-113]
Why Does It Take So Long for Android's Mediaplayer to Prepare Some Live Streams for Playback