I have a recyclerview which is filled in another thread, but the code in addOnScrollListener doesnt work when scrolling.
private class LoadTask extends AsyncTask< NodeList, Void, Void> {
@Override
protected Void doInBackground(NodeList... params) {
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
adapter = new RecyclerViewAdapter(JoinSearchApps.this);
recyclerView.setAdapter(adapter);
GridLayoutManager lLayout = new GridLayoutManager(JoinSearchApps.this, 1);
recyclerView.setLayoutManager(lLayout);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.addOnScrollListener(new PaginationScrollListener(lLayout) {
@Override
protected void loadMoreItems() {
Log.d("inaddOnScrollListener","addOnScrollListener");
}
}
return null;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
LoadTask loader=new LoadTask();
loader.execute();
}
}
you have to setLayoutManager
before setting adapter
to your recyclerview
change your code like below code
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
GridLayoutManager lLayout = new GridLayoutManager(JoinSearchApps.this, 1);
recyclerView.setLayoutManager(lLayout);
adapter = new RecyclerViewAdapter(JoinSearchApps.this);
recyclerView.setAdapter(adapter);
For better ease, you can add another class EndlessRecyclerOnScrollListener
Step 1: Create this class
public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {
public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();
private int previousTotal = 0; // The total number of items in the dataset after the last load
private boolean loading = true; // True if we are still waiting for the last set of data to load.
private int visibleThreshold = 0; // The minimum amount of items to have below your current scroll position before loading more.
int firstVisibleItem, visibleItemCount, totalItemCount;
private int current_page = 0;
private LinearLayoutManager mLinearLayoutManager;
public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) {
this.mLinearLayoutManager = linearLayoutManager;
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mLinearLayoutManager.getItemCount();
firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
//Log.d(TAG, "loading---"+loading);
//Log.d(TAG, (totalItemCount - visibleItemCount) + "-checking-" + (firstVisibleItem + visibleThreshold));
if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
// End has been reached
// Do something
current_page++;
onLoadMore(current_page);
loading = true;
}
}
public abstract void onLoadMore(int current_page);
}
Step 2: call method like this:
mRecyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager) {
@Override
public void onLoadMore(int current_page) {
int listSize = notificationList.size();
if (listSize < notificationCount) {
offset = offset + 10;
limit = limit + 10;
getNotificationsScroll(offset, 10);
}
}
});
I had the similar issue and i solved it using this code ... First create this class
public abstract class EndlessOnScrollListener extends OnScrollListener {
public static String TAG = EndlessOnScrollListener.class.getSimpleName();
// use your LayoutManager instead
private LinearLayoutManager llm;
public EndlessOnScrollListener(LinearLayoutManager sglm) {
this.lm = llm;
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (!recyclerView.canScrollVertically(1)) {
onScrolledToEnd();
}
}
public abstract void onScrolledToEnd();
}
Second .. in you activity use this
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
GridLayoutManager lLayout = new GridLayoutManager(JoinSearchApps.this, 1);
recyclerView.setLayoutManager(lLayout);
recyclerView.setItemAnimator(new DefaultItemAnimator());
adapter = new RecyclerViewAdapter(JoinSearchApps.this);
recyclerView.setAdapter(adapter);
recyclerView.addOnScrollListener(new EndlessOnScrollListener() {
@Override
public void onScrolledToEnd() {
if (!loading) {
loading = true;
Log.d("inaddOnScrollListener","addOnScrollListener");
//Do your operation here and notify the adapter by youradapter.notifyDataSetChanged()
}
loading = false;
}
});
I hope it will work for you to0.
You can't call the method inside the PaginationScrollListener anything you want. You called it loadMoreItems
but that function won't get called. You probably want to rename it to something like onScrolled
or one of the other methods of PaginationScrollListener
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.