如何使用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>

我该怎么做才能让它发挥作用?我到处找,但似乎找不到解决办法。每当屏幕旋转时,我只需要列表保持不变。

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

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

最新更新