web-dev-qa-db-fra.com

Comment enregistrer ArrayList personnalisé sur Android rotation d'écran?

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?

50
Kalina

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);
    }
}
84
Sam

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

3
Techwolf
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);
}
1
Hamdy Abd El Fattah