android – RecyclerView notifyDataSetChanged scrolls to top position-ThrowExceptions

Exception or error:

when calling notifyDataSetChanged on RecyclerView it doesn’t retain the scroll position and scrolls to top, is there any solution to retain it’s scroll position?

How to solve:

If your RecyclerView list item parent has “wrap_content” property, Recyclerview calculates the heights again and scrolls top.

There are two solutions:

  1. Set your height a constant value like this: layout_height="100dp"
  2. Use StaggeredGridLayoutManager like this:

    mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));

The second solution is more efficient and I suggest this one

###

Not sure if this solves your problem but I was having the same issue and it was because I was calling setAdapter after notify. So, not calling setAdapter after notify solved the problem.

mAdapter.notifyItemRangeInserted(mAdapter.getItemCount(), list.size() - 1);
recyclerView.setAdapter(); // remove this line. 
//Do this only when you're setting the data for the first time or when adapter is null. 

###

As I am guessing, what you are doing is resetting the adapter to the RecyclerView and then calling notifyDataSetChanged().

You need to pass only the dataList to the adapter by passing dataList in adapter method like adapter update(dataList).
And in this method you can assign this list to adapter list like;

public void update(ArrayList<Hashmap<String,String> list){
  this.mList = list;
}

###

You can use swapAdapter() and after call notifyDataSetChange(). This works for me.

###

In my case, the recyclerview was paginated. Every time it reaches the end and loads/inserts item using notifyItemInserted, the recyclerView used to scroll. So following worked for me:

recycler_view.stopScroll();

As stated in the doc:

Stop any current scroll in progress, such as one started by
smoothScrollBy(int, int), fling(int, int) or a touch-initiated fling.

###

RecycleViews will scroll back to the top on any variant of notifyDataSetChanged if they don’t have a layout manager. Here’s an example of how to set one.

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, OrientationHelper.VERTICAL, false);
recycleView.setLayoutManager(linearLayoutManager);

###

notifyItemChanged() make the RecyclerView scroll and jump to UP

android:descendantFocusability="blocksDescendants"

Horizontal recyclerView inside vertical recyclerView generally causes that problem and this is best approach to get rid of problem. Don’t put this attr into horizontal recyclerViews, it needs to be in only Parent (vertical RecyclerView).

Leave a Reply

Your email address will not be published. Required fields are marked *