使用带有arraylist的onSaveInstanceState函数

时间:2013-11-12 22:21:25

标签: java android arraylist onconfigurationchanged

我有一个ToDoItem.java类,在我的mainActivity类中,我有一个ToDoItem类型的arraylist。我的意思是我有一个“ArrayList(ToDoItem)listItems”。我希望在任何配置更改的情况下保护我的arraylist。出于这个原因,我想使用onSaveInstanceState函数,但在outState。(...)部分我找不到任何适合我的arraylist类型的函数。有人可以帮我解决如何保存我的arraylist吗?先感谢您。

这是我尝试过的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(savedInstanceState == null)
    {
        listItems = new ArrayList<ToDoItem>();
    }
    else
    {
        listItems = savedInstanceState.getStringArrayList("datas2");//problem in this line
    }

}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);

    outState.putStringArrayList("datas2", listItems); //problem in this line
}
当我使用outState.putSerializable(“datas2”,listItems)时,

logcat:

11-12 17:44:44.565: E/AndroidRuntime(1321): FATAL EXCEPTION: main
11-12 17:44:44.565: E/AndroidRuntime(1321): java.lang.RuntimeException: Parcel: unable to marshal value 0   burcu   12-11-2013   NOT DONE
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.os.Parcel.writeValue(Parcel.java:1235)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.os.Parcel.writeList(Parcel.java:622)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.os.Parcel.writeValue(Parcel.java:1195)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.os.Parcel.writeMapInternal(Parcel.java:591)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.os.Bundle.writeToParcel(Bundle.java:1646)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.os.Parcel.writeBundle(Parcel.java:605)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2318)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3100)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.os.Handler.handleCallback(Handler.java:730)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.os.Looper.loop(Looper.java:137)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at android.app.ActivityThread.main(ActivityThread.java:5103)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at java.lang.reflect.Method.invokeNative(Native Method)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at java.lang.reflect.Method.invoke(Method.java:525)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-12 17:44:44.565: E/AndroidRuntime(1321):     at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:1)

您的ToDoItem课程必须实施Parcelable

see docs

答案 1 :(得分:-2)

您可以使用

@Override 
public Object onRetainNonConfigurationInstance() {
    return this.listItems;    
}

在onCreate()中:

public void onCreate(Bundle savedState)   {
   this.listItems= (List<ToDoItem>)getLastNonConfigurationInstance();

   if(this.listItems!= null) { 

   }
}

已弃用,但有效......

如果你想出于任何原因使用savedInstanceState,你可以让你的对象实现Parcelable ...... 查看帖子:How to save custom ArrayList on Android screen rotate?