我有一个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)
答案 0 :(得分:1)
您的ToDoItem
课程必须实施Parcelable
答案 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?