Как сохранить пользовательский ArrayList на экране Android?

У меня есть ArrayList с пользовательскими объектами, которые я хотел бы сохранить и восстановить на экране.

Я знаю, что это можно сделать с помощью onSaveInstanceState и onRestoreInstanceState если я должен сделать ArrayList своим собственным классом, который реализует Parcelable или Serializable … Но есть ли способ сделать это, не создавая другого класса?

Вам не нужно создавать новый класс для передачи ArrayList ваших пользовательских объектов. Вы должны просто реализовать класс Parcelable для своего объекта и использовать Bundle # putParcelableArrayList () в onSaveInstanceState() и onRestoreInstanceState() . Этот метод будет хранить ArrayList Parcelables самостоятельно.


Поскольку предмет Parcelables (и Serializables и Bundles) иногда заставляет мою голову болеть, вот базовый пример ArrayList, содержащий пользовательские объекты Parcelable, хранящиеся в Bundle. (Это вырезано и вставляемое растение, без макета.)

Реализация 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); 
Intereting Posts
Android – как добавить объект JSON в sharedPreferences? Прокрутка страницы, когда всплывает мягкая клавиатура {Facebook Login} java.lang.NoClassDefFoundError: android.support.v4.content.LocalBroadcastManager Как заставить PopupMenu перекрывать привязку? Как вы можете настроить мягкую клавиатуру EditText для использования номеров вначале, но все же разрешить текст? React Native v Xamarin Forms – Выбор среды для приложений Cross Platform Ошибка: выполнение выполнено для задачи ': app: processDebugResources'. > По индексу 4 Как выглядит Android StackView? IsolatedContext против AndroidTestCase.getContext () Отключить функцию автозапуска в компоненте MyLocationOverlay Как подождать, когда цель электронной почты будет завершена и получить результат? Как реализовать изменяемый размер фрагмента с помощью пользовательского перетаскивания (не предопределенная анимация перехода) Как скопировать виртуальные устройства, загруженные Genymotion на другую машину? Ошибка регистрации зарегистрированного получателя? Когда я выбираю переключатель, мое приложение разбилось