简体   繁体   中英

recyclerview addOnScrollListener doesnt work

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM