Подтвердить что ты не робот

RecyclerView notifyDataSetChanged свитки в верхнюю позицию

при вызове notifyDataSetChanged на RecyclerView он не сохраняет положение прокрутки и прокручивает вверх, есть ли какое-либо решение сохранить его положение прокрутки?

4b9b3361

Ответ 1

Если ваш родительский элемент списка RecyclerView имеет свойство "wrap_content", Recyclerview снова вычисляет высоту и прокручивает вершину.

Есть два решения:

  1. Установите свой рост постоянное значение, как это: layout_height="100dp"
  2. Используйте StaggeredGridLayoutManager следующим образом:

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

Второе решение более эффективно, и я предлагаю это

Ответ 2

Не уверен, что это решает вашу проблему, но у меня была такая же проблема, и это было потому, что я вызывал setAdapter после уведомления. Итак, не вызвав setAdapter после уведомления, решила проблему.

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. 

Ответ 3

RecycleViews будет прокручиваться назад в начало любого варианта notifyDataSetChanged, если у них нет менеджера макетов. Вот пример того, как установить его.

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

Ответ 4

Как я предполагаю, вы делаете перезагрузку адаптера до RecyclerView, а затем вызываете notifyDataSetChanged().

Вам нужно передать только dataList в адаптер, передав dataList в качестве адаптера, например, адаптер update(dataList). И в этом методе вы можете назначить этот список списку адаптеров, например:

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

Ответ 5

В моем случае просмотрщик страниц был разбит на страницы. Каждый раз, когда он достигает конца и загружает/вставляет элемент, используя notifyItemInserted, recyclerView используется для прокрутки. Так у меня сработало следующее:

recycler_view.stopScroll();

Как указано в документе:

Остановите любую текущую прокрутку, например, запущенную с помощью smoothScrollBy (int, int), fling (int, int) или броском, инициированным касанием.

Ответ 6

вы можете сохранить позицию, сохранив ее перед notifyDataSetChanged, а затем вызовите гладкую прокрутку в сохраненную позицию

final int currentVisibleItem = ((LinearLayoutManager) layourmanager).findFirstCompletelyVisibleItemPosition();
                           productListAdapter.notifyDataSetChanged();
                            Handler handler = new Handler();
                            handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {

                    if(currentVisibleItem>-1 && currentVisibleItem<lstProducts.size())
                                    rv_products.scrollToPosition(currentVisibleItem);
                                }
                            }, 100);