如何在Android屏幕上保存自定义ArrayList旋转?

问题描述:

我有一个ArrayList与自定义对象,我希望能够保存和恢复在屏幕上旋转。如何在Android屏幕上保存自定义ArrayList旋转?

我知道,这可与onSaveInstanceStateonRestoreInstanceState做,如果我让ArrayList自己的类,它实现了无论是ParcelableSerializable ......但是,有没有办法做到这一点,而无需创建另一个类?

您不需要创建一个新类来传递自定义对象的ArrayList。您应该简单地为您的对象实现Parcelable类并使用onSaveInstanceState()onRestoreInstanceState()中的Bundle#putParcelableArrayList()。这个方法将自己存储一个Parcelables的ArrayList。


由于Parcelables并(和Serializables和束)的主题有时使我的头伤,这里是包含存储在一个包定制Parcelable对象的ArrayList的基本示例。 (这是馏分&膏可运行的,没有必要的布局。)

实现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); 
    } 
} 
+1

谢谢!然而,我迷失在'private MyObject(Parcel in){color = in.readString(); number = in.readString(); }'这对Strings来说很简单,但是如何阅读我的自定义数组列表? 'in.readArrayList(MyObject.class.getClassLoader())'给我一个错误。 – Kalina

+1

嗯,在你问你关于“一个ArrayList与自定义对象”的问题暗示'ArrayList ',这个答案在'Parcelable.Creator'中处理;然而,您的评论只是问“我如何阅读我的自定义数组列表”,暗示着“MyArrayList”。你想要延续什么课程? (对不起,我想给你最快的答案。) – Sam

+0

对不起,我的意思是ArrayList Kalina

您可以使用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

+0

哇,永远不知道这个功能!超级简单,正是我需要的......但是,我发现它已被弃用... – Kalina

+0

不幸的是,它仍然有效,并且没有其他简单的方法可以做到这一点。山姆的回答是我找到的唯一方式,但实施起来要困难得多。 – Techwolf

+3

如果你使用Fragments,你可以使用'Fragment.setRetainInstance(true)',这是这个的新版本(但只适用于Fragments)。文档:http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(布尔值) – Techwolf

是的,你可以保存你的组合对象共享偏好。比方说:

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); 
+1

不好的想法做到这一点 - 取决于正在保存的列表的大小。 SharedPreferences是一个XML文件,它不是为存储大量数据集而设计的。 – mwieczorek