Как добавить кастомизированный адаптер RecyclerView в outState в методе onSaveInstanceState что бы пересоздавать RecyclerView?

В приложении есть RecyclerView, в нём какие-то item сохраняются пользователем и живут.После того как приложение закрывается, RecyclerView ожидаемо становится пустым при открытии. Необходимо что бы при открытии приложения состояние RecyclerView сохранялось? Хочу делать это в onSaveInstanceState , сохранять адаптер и потом в onCreate его переопределять.Как это сделать?Какие плюсы и минусы этого метода? Как сделали бы вы?


Ответы (1 шт):

Автор решения: Circassian

Получаете состояние(state) методом recyclerView.getLayoutManager().onSaveInstanceState(); и сохраняете в методе onSaveInstanceState() фрагмента или активити. Там же сохраняете список элементов.

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putParcelableArrayList(ARRAY_LIST_RESULTS, list);
    outState.putParcelable(LIST_STATE, recyclerView.getLayoutManager().onSaveInstanceState());
}

При восстановлении, получаете из бандла сохраненный список и скармливаете адаптеру, а также восстанавливаете state.

list = savedInstanceState.getParcelableArrayList(ARRAY_LIST_RESULTS);
Parcelable listState = savedInstanceState.getParcelable(LIST_STATE);
if(listState != null) { 
    recyclerView.getLayoutManager().onRestoreInstanceState(listState);
}

Если у вас фрагмент, то установите флаг setRetainInstance(true); и состояние экрана должно сохраняться и восстанавливаться без дополнительного кода. Но это не точно)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}
→ Ссылка