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