¿Cómo se puede girar ArrayList personalizado en la pantalla de Android?

Tengo un ArrayList con objetos personalizados que me gustaría poder guardar y restaurar en una pantalla rotada.

Sé que esto se puede hacer con onSaveInstanceState y onRestoreInstanceState si onRestoreInstanceState que hacer ArrayList su propia clase, que implementa Parcelable o Serializable … ¿Pero hay una manera de hacer esto sin crear otra clase?

No necesita crear una nueva clase para pasar una ArrayList de sus objetos personalizados. Simplemente debe implementar la clase Parcelable para su objeto y usar Bundle # putParcelableArrayList () en onSaveInstanceState() y onRestoreInstanceState() . Este método almacenará una ArrayList de Parcelables por sí mismo.


Debido a que el tema de Parcelables (y Serializables y Bundles) a veces me daña la cabeza, aquí hay un ejemplo básico de una ArrayList que contiene objetos Parcelable personalizados almacenados en un Bundle. (Esto es cortar y pegar ejecutable, no es necesario el diseño).

Implementando 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 CREATOR = new Parcelable.Creator() { public MyObject createFromParcel(Parcel in) { return new MyObject(in); } public MyObject[] newArray(int size) { return new MyObject[size]; } }; } 

Guardar / restaurar estados

 public class Example extends ListActivity { ArrayList 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(); for(int i = 0; i < numbers.length; i++) list.add(new MyObject(numbers[i], colors[i])); } else { list = savedInstanceState.getParcelableArrayList("key"); } setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list)); } @Override protected void onSaveInstanceState(Bundle outState) { outState.putParcelableArrayList("key", list); super.onSaveInstanceState(outState); } } 

Puede usar onRetainNonConfigurationInstance() . Le permite guardar cualquier objeto antes de un cambio de configuración y restaurarlo luego con getLastNonConfigurationInstanceState ().

Dentro de la actividad:

  @Override public Object onRetainNonConfigurationInstance() { return myArrayList; } 

Dentro de onCreate() :

  try{ ArrayList myArrayList = (ArrayList)getLastNonConfigurationInstance(); } catch(NullPointerException e) {} 

Gestión de cambios de tiempo de ejecución: http://developer.android.com/guide/topics/resources/runtime-changes.html Documentación: http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance%28 % 29

Sí, puede guardar su objeto compuesto en preferencias compartidas. Digamos:

 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(); 

y ahora puedes recuperar tu objeto como:

  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);