首页 > 解决方案 > 如何使用 onSaveInstanceState 保存填充了 person 类型的对象的数组列表?

问题描述

我有这个清单:

private ArrayList<Person> people = new ArrayList<>();

这个名单上到处都是随机的人。每当我转动屏幕时,列表都会刷新并出现一个新列表。我不希望这种情况发生。

我试图用这样的 onSaveInstanceState 方法来做到这一点:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelableArrayList("key", people);
}

但我收到以下错误:

Required type: ArrayList <? extends Parcelable>
Provided: ArrayList<Person>

我可以通过将代码更改为:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelableArrayList("key", (ArrayList<? extends Parcelable>) people);
}

但是,当我转到要加载数据的 onCreate 方法时,我使用以下代码:

if(savedInstanceState != null)
    {
        people = savedInstanceState.getParcelableArrayList("key");
    }

我收到以下错误:

Required type: ArrayList <Person>
Provided: ArrayList<Parcelable>

我能做些什么来完成这项工作?我到处寻找,但似乎找不到解决方案。每当屏幕旋转时,我只需要列表保持不变。

标签: javaandroidarraylistparcelableonsaveinstancestate

解决方案


有几种可能的方法可以解决这个问题:

  • onSaveInstanceState()通过让您的类Person实现Parcelable接口来保存列表。请参阅有关如何实现的 Android 文档Parcelable(您将需要实现一些额外的方法来保存和恢复Person实例中的数据。
  • 使用onRetainNonConfigurationInstance()getLastNonConfigurationInstance()。您可以返回您的Person对象列表,onRetainNonConfigurationInstance()然后您可以在重新创建onCreate()时检索它Activity(在 Android 由于方向更改而杀死它之后)。
  • 声明变量static,在这种情况下它不会在 Android 杀死你Activity并创建一个新变量后重新初始化。这不是首选方法,但它是最简单的方法。

推荐阅读