J'ai un ArrayList
avec des objets personnalisés que j'aimerais pouvoir sauvegarder et restaurer sur une rotation d'écran.
Je sais que cela peut être fait avec onSaveInstanceState
et onRestoreInstanceState
si je devais faire du ArrayList
sa propre classe, qui implémente Parcelable
ou Serializable
... Mais existe-t-il un moyen de le faire sans créer une autre classe?
Vous n'avez pas besoin de créer une nouvelle classe pour passer une liste de tableaux de vos objets personnalisés. Vous devez simplement implémenter la classe Parcelable pour votre objet et utiliser Bundle # putParcelableArrayList () dans onSaveInstanceState()
et onRestoreInstanceState()
. Cette méthode stockera une ArrayList of Parcelables par elle-même.
Parce que le sujet de Parcelables (et Serializables et Bundles) me fait parfois mal à la tête, voici un exemple de base d'une ArrayList contenant des objets Parcelable personnalisés stockés dans un Bundle. (Ceci est exécutable par copier-coller, aucune disposition n'est nécessaire.)
Implémentation de 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];
}
};
}
États de sauvegarde/restauration
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);
}
}
Vous pouvez utiliser onRetainNonConfigurationInstance()
. Il vous permet d'enregistrer n'importe quel objet avant un changement de configuration et de le restaurer après avec getLastNonConfigurationInstanceState
().
A l'intérieur de l'activité:
@Override
public Object onRetainNonConfigurationInstance() {
return myArrayList;
}
Dans onCreate()
:
try{
ArrayList myArrayList = (ArrayList)getLastNonConfigurationInstance();
} catch(NullPointerException e) {}
Gestion des modifications du runtime: http://developer.Android.com/guide/topics/resources/runtime-changes.html Documentation: http://developer.Android.com/reference/ Android/app/Activity.html # onRetainNonConfigurationInstance% 28% 29
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
ArrayList<Integer> id=new ArrayList<>();
ArrayList<String> title=new ArrayList<>();
for(int i=0;i<arr.size();i++){
id.add(arr.get(i).id);
title.add(arr.get(i).title);
}
outState.putIntegerArrayList("id",id);
outState.putStringArrayList("title",title);
}