Intereting Posts
Android Studio «Структура проекта» не подходит должным образом Анимированная анимация карты между действиями Проверьте, включено ли «Автообновление» в системных настройках Android Минимизируйте приложение, когда нажимаете кнопку «Назад». Как сделать HTTPS-вызовы с помощью AsyncHttpClient? Espresso: return boolean, если вид существует Как разобрать строку измерения и преобразовать ее в значение измерения Как интегрировать функцию «Как» и «Комментировать» с помощью Android Facebook SDK? Однострочный шрифт с использованием привязки данных Android-M не работает ViewPager внутри BottomSheetDialogFragment Как просмотреть файл общих настроек с помощью Android Studio? Команда не выполнялась успешно из-за неожиданного исключения. Пожалуйста, проверьте выходное окно для получения дополнительной информации. Хранение видео для офлайн-использования в приложениях PhoneGap / Chrome Модуль, приведенный ниже, был удален из структуры «Грейдл» Проверка диалогового ввода

Наиболее правильно сохранить состояние RecyclerView?

У меня есть фрагмент, содержащий recyclerview в основной деятельности

Fragment.java

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = inflater.inflate(R.layout.activity_main, container, false); initInstances(view); setRetainInstance(true); return view; } private void initInstances(View view) { mRecyclerView = (RecyclerView) view.findViewById(R.id.dialogList); mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); adapter = new MyAdapter(items); mRecyclerView.setAdapter(mAdapter); } 

MainActivity.java

В методе onCreate:

 myFragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(MyFragment.TAG); if (MyFragment == null) { MyFragment = new MyFragment(); getSupportFragmentManager().beginTransaction().add(R.id.content_frame, myFragment, MyFragment.TAG).commit(); } 

Но когда изменилась ориентация, мой RecyclerView перерисовывался.

Я попытался сохранить состояние с переопределением onSaveInstanceState и onRestoreInstanceState как это. Как предотвратить изменение пользовательских представлений из-за изменений ориентации на экране или сохранение и восстановление состояния Android вида , но для меня это не принесло пользы

Как правильно сохранить состояние элементов RecyclerView и адаптера при изменении ориентации?

РЕШЕНИЕ: Мой фрагмент простирается от BaseFragment несколькими способами:

 public class BaseFragment extends Fragment{ Bundle savedState; public BaseFragment() { super(); if (getArguments() == null) setArguments(new Bundle()); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (!restoreStateFromArguments()) { onFirstTimeLaunched(); } } protected void onFirstTimeLaunched() { } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); saveStateToArguments(); } public void saveStateToArguments() { if (getView() != null) savedState = saveState(); if (savedState != null) { Bundle b = getArguments(); b.putBundle("internalSavedViewState8954201239547", savedState); } } private boolean restoreStateFromArguments() { Bundle b = getArguments(); savedState = b.getBundle("internalSavedViewState8954201239547"); if (savedState != null) { onRestoreState(savedState); return true; } return false; } private Bundle saveState() { Bundle state = new Bundle(); onSaveState(state); return state; } protected void onRestoreState(Bundle savedInstanceState) { } protected void onSaveState(Bundle outState) { } @Override public void onStart() { super.onStart(); } @Override public void onStop() { super.onStop(); } @Override public void onDestroyView() { super.onDestroyView(); saveStateToArguments(); } 

В моем фрагменте я переопределяю методы и сохраняю состояние mLayoutManager

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override protected void onSaveState(Bundle outState) { super.onSaveState(outState); outState.putParcelable("myState", mLayoutManager.onSaveInstanceState()); } @Override protected void onRestoreState(Bundle savedInstanceState) { super.onRestoreState(savedInstanceState); mLayoutManager.onRestoreInstanceState(savedInstanceState.getParcelable("myState")); } 

Solutions Collecting From Web of "Наиболее правильно сохранить состояние RecyclerView?"

Я искал, как получить позицию прокрутки RecyclerView, но не видел, где я могу ее получить, поэтому я считаю, что лучшим решением является обработка изменений вращения непосредственно в вашем Java-коде и предотвращение перезапуска активности при изменении ориентации.

Чтобы предотвратить перезагрузку при изменении ориентации, вы можете следовать этому решению .

После предотвращения перезагрузки вашей деятельности вы можете создать 2 файла макета xml, один для портретного режима и один для ландшафтного режима, вы добавите FrameLayout в оба файла xml, удерживая место для вашего RecyclerView.

Когда вызывается метод onConfigurationChange (Configuration newConfig), вы вызываете setContentView (int layoutFile) с соответствующим LayoutFile в соответствии с новой ориентацией и добавляете RecyclerView, который вы держите в члене своего класса в FrameLayout.