RecyclerView Endless Infinite Scrolling Issue

↘锁芯ラ 提交于 2019-11-30 08:20:58

I had the same issue once an I solve 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.addOnScrollListener(new EndlessOnScrollListener() {

    @Override
    public void onScrolledToEnd() {
        if (!loading) {
            loading = true;
            // add 10 by 10 to tempList then notify changing in data
        }
        loading = false;
    }
});

This works for me .... I hope it works for you to.

Try notifyItemRangeChanged

yourCurrentList.addAll(newData);    
mAdapter.notifyItemRangeChanged(yourCurretList.size() + 1, newDataSize);

I think this'll help you.

1.

Getting first 11 recyclerview Items blank (And showing progress bar continuously), see below screenshot:

Change loadData method as:

private void loadData() {
  new Parser().execute("http://clienturl.com/jsons/mytest.txt");  
 }

2.

Whereas I was suppose to get first 10 records, and on scroll next 10 records and so on...

Change onPostExecute method of Parser as:

protected void onPostExecute(Boolean result) {
    dialog.cancel();
    ArrayList< Student > temArray = 
                 new ArrayList< Student >(studentList.subList(0, 10));           
    mAdapter = new DataAdapter(temArray, mRecyclerView);

    // set the adapter object to the Recyclerview
    mRecyclerView.setAdapter(mAdapter);
 }

And also remove following lines from onCreate method:

    mAdapter = new DataAdapter(studentList, mRecyclerView);

    // set the adapter object to the Recyclerview
    mRecyclerView.setAdapter(mAdapter);
Osvaldo Bringaz

Try changing the

int i = start + 1; i <= end; i++

in the for loop to

int i = start + 1; i < end; i++

The <= validation adds an extra item.

Issue-1: You have created a new instance of mAdapter before setting the LayoutManager for RecyclerView. Thereby the constructor code in the DataAdapter to add ScrollListener is not executed since recyclerView.getLayoutManager() returns null:

    if (recyclerView.getLayoutManager() instanceof LinearLayoutManager){
        // code to add ScrollListener is never executed
    }

Fix: First set the LayoutManager for the Recyclerview and then create the adapter like below:

    // use a linear layout manager
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new DataAdapter(temArray, mRecyclerView);
    // set the adapter object to the Recyclerview
    mRecyclerView.setAdapter(mAdapter);

Issue-2: You have used temArray to create DataAdapter but in onLoadMore() you are using the studentList to add/remove new items, since studentList is not binded with mAdapter your changes doesn't reflect in the UI.

Fix: Declare temArray as a class level variable and use temArray to manipulate the items.

 //class variable
 private ArrayList<Student> temArray = new ArrayList<Student>();

 handler.postDelayed(new Runnable() {
            @Override public void run() {
              //   remove progress item
              temArray.remove(temArray.size() - 1);
              mAdapter.notifyItemRemoved(temArray.size());
              //add items one by one
              int start = temArray.size();
              int end = start + 10;
              if(end<=studentList.size()){
                temArray.addAll(studentList.subList(start,end));
              }   
              mAdapter.setLoaded();
            }
          }, 2000);

replace

private List<Student> studentList;

with

private List<Object> list;

also replace

@Override
public int getItemViewType(int position) {
    return studentList.get(position) != null ? VIEW_ITEM : VIEW_PROG;
}

with

@Override
public int getItemViewType(int position) {
  return list.get(position) instanceof Student ?  VIEW_ITEM : VIEW_PROG;
}

for detect end of List you can using

@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);

            // When went to the end of the list, load more posts
            if (newState == RecyclerView.SCROLL_STATE_IDLE) {

                if (linearLayoutManager.findLastVisibleItemPosition() >= linearLayoutManager.getItemCount() - 1) {

                    // Grow List
                }
            }
}

Also for Add Loading Item. add this code in adapter

public void addLoadingView(){
   list.add(new Object());
   notifyDataSetChanged();
}
Ankur1994a
for (int i = start + 1; i < end; i++) {
    studentList.add(add data here) ;
    mAdapter.notifyItemInserted(studentList.size());
}
        mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
                    @Override
                    public void onLoadMore() {
                        //add null , so the adapter will check view_type and show progress bar at bottom
                        studentList.add(null);
                        mAdapter.notifyItemInserted(studentList.size() - 1);

                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                //   remove progress item
                                studentList.remove(studentList.size() - 1);
                                mAdapter.notifyItemRemoved(studentList.size());
                                //add items one by one
                                int start = studentList.size();
                                int end = start + 10;

                                for (int i = start + 1; i < end; i++) {
   // studentList.add();
                                    mAdapter.notifyItemInserted(studentList.size());
                                }
                                mAdapter.setLoaded();
                               //or you can add all at once but do not forget to call mAdapter.notifyDataSetChanged();
                            }
                        }, 2000);
                    }
                });

ok so you inserted progress bar, and then you've removed it as well but you never inserted the next student to show... something like studentList.add();

I hope that solved your problem... good luck..

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!