Как сохранить пользовательский ArrayList на экране Android?
у меня есть ArrayList
с пользовательскими объектами, которые я хотел бы иметь возможность сохранять и восстанавливать на экране поворота.
Я знаю, что это можно сделать с onSaveInstanceState
и onRestoreInstanceState
если бы я должен был сделать ArrayList
свой собственный класс, который реализует либо Parcelable
или Serializable
... Но есть ли способ сделать это без создания другого класса?
3 ответов
вам не нужно создавать новый класс для передачи ArrayList ваших пользовательских объектов. Вы должны просто реализовать класс Parcelable для своего объекта и использовать Bundle#putParcelableArrayList () на onSaveInstanceState()
и onRestoreInstanceState()
. Этот метод будет хранить ArrayList Parcelables сам по себе.
поскольку тема Parcelables (и Сериализуемых и Пучков) иногда заставляет мою голову болеть, вот основной пример ArrayList, содержащий пользовательский Parcelable объекты, хранящиеся в связке. (Это вырезать и вставить runnable, не макет необходимо.)
Реализует 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
Да, вы можете сохранить составной объект в общих настройках. Скажем:
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);