如何在Android屏幕上保存自定义ArrayList旋转?
我有一个ArrayList
与自定义对象,我希望能够保存和恢复在屏幕上旋转。如何在Android屏幕上保存自定义ArrayList旋转?
我知道,这可与onSaveInstanceState
和onRestoreInstanceState
做,如果我让ArrayList
自己的类,它实现了无论是Parcelable
或Serializable
......但是,有没有办法做到这一点,而无需创建另一个类?
您不需要创建一个新类来传递自定义对象的ArrayList。您应该简单地为您的对象实现Parcelable类并使用onSaveInstanceState()
和onRestoreInstanceState()
中的Bundle#putParcelableArrayList()。这个方法将自己存储一个Parcelables的ArrayList。
由于Parcelables并(和Serializables和束)的主题有时使我的头伤,这里是包含存储在一个包定制Parcelable对象的ArrayList的基本示例。 (这是馏分&膏可运行的,没有必要的布局。)
实现Parcelable
public class MyObject implements Parcelable {
String color;
String number;
public MyObject(String number, String color) {
this.color = color;
this.number = number;
}
private MyObject(Parcel in) {
color = in.readString();
number = in.readString();
}
public int describeContents() {
return 0;
}
@Override
public String toString() {
return number + ": " + color;
}
public void writeToParcel(Parcel out, int flags) {
out.writeString(color);
out.writeString(number);
}
public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
public MyObject createFromParcel(Parcel in) {
return new MyObject(in);
}
public MyObject[] newArray(int size) {
return new MyObject[size];
}
};
}
保存/恢复美国
public class Example extends ListActivity {
ArrayList<MyObject> list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState == null || !savedInstanceState.containsKey("key")) {
String[] colors = {"black", "red", "orange", "cyan", "green", "yellow", "blue", "purple", "magenta", "white"};
String[] numbers = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};
list = new ArrayList<MyObject>();
for(int i = 0; i < numbers.length; i++)
list.add(new MyObject(numbers[i], colors[i]));
}
else {
list = savedInstanceState.getParcelableArrayList("key");
}
setListAdapter(new ArrayAdapter<MyObject>(this, android.R.layout.simple_list_item_1, list));
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList("key", list);
super.onSaveInstanceState(outState);
}
}
您可以使用onRetainNonConfigurationInstance()
。它允许您在配置更改之前保存任何对象,并使用getLastNonConfigurationInstanceState
()恢复它。
活动内部:
@Override
public Object onRetainNonConfigurationInstance() {
return myArrayList;
}
内onCreate()
:
try{
ArrayList myArrayList = (ArrayList)getLastNonConfigurationInstance();
} catch(NullPointerException e) {}
处理运行时更改:http://developer.android.com/guide/topics/resources/runtime-changes.html 文档:http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance%28%29
哇,永远不知道这个功能!超级简单,正是我需要的......但是,我发现它已被弃用... – Kalina
不幸的是,它仍然有效,并且没有其他简单的方法可以做到这一点。山姆的回答是我找到的唯一方式,但实施起来要困难得多。 – Techwolf
如果你使用Fragments,你可以使用'Fragment.setRetainInstance(true)',这是这个的新版本(但只适用于Fragments)。文档:http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(布尔值) – Techwolf
是的,你可以保存你的组合对象共享偏好。比方说:
Student mStudentObject = new Student();
SharedPreferences appSharedPrefs = PreferenceManager
.getDefaultSharedPreferences(this.getApplicationContext());
Editor prefsEditor = appSharedPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(mStudentObject);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
,现在你可以检索你的对象为:
SharedPreferences appSharedPrefs = PreferenceManager
.getDefaultSharedPreferences(this.getApplicationContext());
Editor prefsEditor = appSharedPrefs.edit();
Gson gson = new Gson();
String json = appSharedPrefs.getString("MyObject", "");
Student mStudentObject = gson.fromJson(json, Student.class);
不好的想法做到这一点 - 取决于正在保存的列表的大小。 SharedPreferences是一个XML文件,它不是为存储大量数据集而设计的。 – mwieczorek
谢谢!然而,我迷失在'private MyObject(Parcel in){color = in.readString(); number = in.readString(); }'这对Strings来说很简单,但是如何阅读我的自定义数组列表? 'in.readArrayList(MyObject.class.getClassLoader())'给我一个错误。 – Kalina
嗯,在你问你关于“一个ArrayList与自定义对象”的问题暗示'ArrayList',这个答案在'Parcelable.Creator'中处理;然而,您的评论只是问“我如何阅读我的自定义数组列表”,暗示着“MyArrayList”。你想要延续什么课程? (对不起,我想给你最快的答案。) –
Sam
对不起,我的意思是ArrayList –
Kalina