No necesita crear una nueva clase para pasar una lista de arreglos 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 Paquetes) a veces hace que me duela la cabeza, aquí es un ejemplo básico de un ArrayList que contiene objetos personalizados parcelable almacenados en un paquete. (Esta pasta se corta & ejecutable, sin la disposición necesaria.)
Ejecución 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];
}
};
}
Unidos
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);
}
}
Gracias! Sin embargo, estoy perdido en el 'MyObject privado (Parcela) { color = in.readString(); number = in.readString(); } 'bit ... Eso es fácil para Strings, pero ¿cómo leo mi lista de arrays personalizada? 'in.readArrayList (MyObject.class.getClassLoader())' me da un error. – Kalina
Hmm, en su pregunta, preguntó acerca de "una lista de matrices con objetos personalizados" que implica 'ArrayList', que esta respuesta maneja en 'Parcelable.Creator'; Sin embargo, su comentario solo preguntaba "¿cómo leo mi lista de arrays personalizada?", lo que implica 'MyArrayList'. ¿Qué clase estás tratando de extender? (Perdón por ser técnico, pero quiero darte la mejor respuesta lo más rápido posible). –
Sam
Lo siento, me refiero a ArrayList –
Kalina