How to save custom ArrayList on Android screen rotate? How to save custom ArrayList on Android screen rotate? android android

How to save custom ArrayList on Android screen rotate?


You do not need to create a new class to pass an ArrayList of your custom objects. You should simply implement the Parcelable class for your object and use Bundle#putParcelableArrayList() in onSaveInstanceState() and onRestoreInstanceState(). This method will store an ArrayList of Parcelables by itself.


Because the subject of Parcelables (and Serializables and Bundles) sometimes makes my head hurt, here is a basic example of an ArrayList containing custom Parcelable objects stored in a Bundle. (This is cut & paste runnable, no layout necessary.)

Implementing 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];        }    };}

Save / Restore States

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


You can use onRetainNonConfigurationInstance(). It allows you to save any object before an configuration change, and restore it after with getLastNonConfigurationInstanceState().

Inside the activity:

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

Inside onCreate():

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

Handling Runtime Changes: http://developer.android.com/guide/topics/resources/runtime-changes.htmlDocumentation: 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);}