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

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

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

3 ответов


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


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

Реализует 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);