Android автоматически сохраняет и восстанавливает состояние экземпляра какого-либо поля? - PullRequest
0 голосов
/ 29 мая 2020

У меня есть RecyclerView с MyItem для хранения данных для каждой строки в RecyclerView, и все правильно реализовано и работает нормально.

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder>{
    protected final List<MyItem> items= new ArrayList<>();
    public MyAdapter (List<RVItem> list) {
        if (list != null) {
            items.addAll(list);
        }
    }
}

И элементы списка передаются из другого объекта.

public class MyObject{
    private String otherThing;
    private List<MyItem> items;
    public someMethodToInitItems() {
        items = new ArrayList<>();
        items.add(...);
        items.add(...);
    }
    public createFragment() {
        Fragment f = new MyCustomFragment();
        f.setAdapter(new MyAdapter(items));
        // replace commit fragment...
    }
}

Проблема здесь в том, что когда моя активность восстанавливается, поле private List<MyItem> items в MyObject тоже каким-то волшебным образом восстанавливается, но поле вроде otherThing по-прежнему равно нулю и не восстанавливается. К вашему сведению, я никоим образом не сохранял и не восстанавливал items. Кроме того, onSaveInstanceState в MyCustomFragment остается нетронутым и не переопределяется из super.

Ниже показано, как я пытаюсь сохранить и восстановить состояние фрагмента из Activity. Вот и все.

public class MyActivity{
    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        getSupportFragmentManager().putFragment(outState, tag, getLastFragment());
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState != null) {
            Fragment fg = getSupportFragmentManager().getFragment(savedInstanceState, tag);
        }
    }
}

Итак, я не понимаю. Система Android выполнила эту работу? Сохранить и восстановить поле items в MyObject автоматически? Или должно быть что-то еще, вызывающее такое поведение.

1 Ответ

0 голосов
/ 02 июня 2020

Вам необходимо переопределить метод onRetainNonConfigurationInstance. Этот метод может помочь вам сохранить ваши данные

Подробнее здесь

...