при вызове notifyDataSetChanged
на RecyclerView
он не сохраняет положение прокрутки и прокручивает вверх, есть ли какое-либо решение сохранить его положение прокрутки?
RecyclerView notifyDataSetChanged свитки в верхнюю позицию
Ответ 1
Если ваш родительский элемент списка RecyclerView имеет свойство "wrap_content", Recyclerview снова вычисляет высоту и прокручивает вершину.
Есть два решения:
- Установите свой рост постоянное значение, как это:
layout_height="100dp"
-
Используйте 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);
Ответ 7
Вы можете использовать swapAdapter() и после вызова notifyDataSetChange(). Это работает для меня.