Хранение данных собственного адаптера после вращения

У меня есть приложение с listview (одна строка содержит textview, imageview, ratingbar) и мой собственный адаптер. Когда я поворачиваю экран после сортировки списка (я выбираю этот параметр в меню), он возвращается к форме перед сортировкой. Я попробовал переопределить onSaveInstanceState:

@Override
public void onSaveInstanceState(Bundle outState)
{
 super.onSaveInstanceState(outState);
 outState.putParcelable("listView", listView.onSaveInstanceState());
}

и фрагмент onCreate:

listView.setAdapter(adapter);

 if(savedInstanceState!=null)
 {
 mListInstanceState=savedInstanceState.getParcelable("listView");
 listView.onRestoreInstanceState(mListInstanceState);
 }

Но это не сработает. Должен ли я переопределить onRestoreInstanceState или использовать что-то еще?

1 ответ

Проблема заключается в том, что при изменении ориентации ваша Activity воссоздана, и когда onCreate() вы устанавливаете адаптер с элементами списка по умолчанию.

Если вы не поддерживаете разный layout для пейзажа/портрета, вы можете просто избежать воссоздания Activity, просто добавив в манифест configChanges для своей Activity

android:configChanges="orientation|screenSize" // add this line

Это позволит избежать воссоздания Activity и тот же макет будет использоваться для установки ширины экрана. Убедитесь, что ширина макета listView установлена в match_parent.

Если вы все еще хотите, чтобы ваша Activity воссоздана, вам необходимо запомнить последний выбранный фильтр, когда onSaveInstanceState вызывается смены ориентации

@Override
public void onSaveInstanceState(Bundle outState)= {
 outState.putString("selectedFilter","some name");
 super.onSaveInstanceState(outState);
}

И затем, когда onCreate в вызове после поворота, вы можете получить имя selectedFilter

String filterName = null;

 if(savedInstanceState != null){
 filterName = savedInstanceState.getString("lastFilter");
 }

Наконец, установите listView с элементами на основе имени фильтра.

if(filterName != null && filterName.equalsIgnoreCase("some name")){
 // filtered list items
 } else {
 // default list items
 }

licensed under cc by-sa 3.0 with attribution.