Intereting Posts
Duplicate entry: com / android / volley / AuthFailureError.class при компиляции проекта в студии android DialogFragment отображает список значков с подкачкой Gradle Android Plugin – добавить атрибут атрибута? Android: java.lang.SecurityException: для ввода в другое приложение требуется разрешение INJECT_EVENTS Чтение из базы данных в андроиде в arraylist Можно ли использовать библиотеки FFmpeg в приложении для Android? Отчет о выпуске Android Lint <issue> Гибридное приложение Visual Studio 2015 – получение «EPERM, операция не разрешена» Как получить доступ к температурному датчику Galaxy S5? Зацикливание через SQLite Cursor занимает слишком много времени Эмуляция ионных действительно медленная даже при геймотировании, просто используя пример «вкладок» Исправление ошибок Eclipse при использовании Android NDK и std :: vector 24-часовой режим не работает в формате dateformat android QuickBlox Android SDK 1.2 больше не работает в Android API до 14 Перезапуск / приостановка потока в onResume / onPause

RecyclerView notifyDataSetChanged свитки в верхнее положение

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

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

Существует два решения:

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

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

Если вы хотите изменить элементы с анимацией, используйте метод notifyItemChanged в Fragment или Activity. Не в классе адаптера:

 mRecyclerView.getAdapter().notifyItemChanged(position); 

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

Не уверен, что это решает вашу проблему, но у меня была такая же проблема, и это было потому, что я вызывал 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. 

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

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

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

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

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

Вы можете использовать swapAdapter () и после вызова notifyDataSetChange () . Это работает для меня.