对象Parceable的ArrayList [英] Parceable Arraylist of objects
问题描述
我想的人从在MainActivity到SecondActivity对象打印在自定义的ListView适配器的人的细节来传递一个ArrayList
在应用程序运行,但是当它到达 startActivity()
路过的人的ArrayList中后SecondActivity。
人物器具 Parcelable
公众人物(ID字符串,字符串名称){
this.id = ID;
this.name =名称;
}公众人物(包裹中){
ID = in.readString();
名称= in.readString();
}公共无效writeToParcel(包裹出来,诠释标志){
out.writeString(ID);
out.writeString(名);
}公共静态最终Parcelable.Creator<&人GT; CREATOR =新Parcelable.Creator<&人GT;()
{
@覆盖
公众人物createFromParcel(包裹中){
返回新的Person(中);
} @覆盖
公众人物[] newArray(INT大小){
返回新的Person【尺寸】;
}};
MainActivity
列表<&人GT;名单=新的ArrayList<&人GT;();公共无效onButtonClick(){
意向意图=新意图(getApplicationContext(),SecondActivity.class);
intent.putExtra(personObject清单);
startActivity(意向);
}
二等活动
保护无效的onCreate(){
意向I = getIntent();
ArrayList的<&人GT;人=(ArrayList的<&人GT;)i.getParcelableExtra(personObject); //获取人员从MainActivity ArrayList中
listView.setAdapter(新personAdapter(这一点,R.layout.person_list_layout,人员));
编辑:堆栈跟踪误差
E / AndroidRuntime(16698):了java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.testApp / com.example.testApp.SecondActivity}:java.lang中。空指针异常
E / AndroidRuntime(16698):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212)
E / AndroidRuntime(16698):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
E / AndroidRuntime(16698):在android.app.ActivityThread.access $ 800(ActivityThread.java:144)
E / AndroidRuntime(16698):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1205)
E / AndroidRuntime(16698):在android.os.Handler.dispatchMessage(Handler.java:102)
E / AndroidRuntime(16698):在android.os.Looper.loop(Looper.java:136)
E / AndroidRuntime(16698):在android.app.ActivityThread.main(ActivityThread.java:5146)
E / AndroidRuntime(16698):在java.lang.reflect.Method.invokeNative(本机方法)
E / AndroidRuntime(16698):在java.lang.reflect.Method.invoke(Method.java:515)
E / AndroidRuntime(16698):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:732)
E / AndroidRuntime(16698):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
E / AndroidRuntime(16698):在dalvik.system.NativeStart.main(本机方法)
E / AndroidRuntime(16698):显示java.lang.NullPointerException:产生的原因
E / AndroidRuntime(16698):在com.example.testApp.SecondActivity.onCreate(SecondActivity.java:35)
E / AndroidRuntime(16698):在android.app.Activity.performCreate(Activity.java:5231)
E / AndroidRuntime(16698):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E / AndroidRuntime(16698):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
EDIT2:在错误日志中第35行
listView.setAdapter(新personAdapter(这一点,R.layout.person_list_layout,人员));
ArrayList中没有农具 Parcelable
,但它实现序列化
,所以你不能使用 getParcelableExtra
来接收数据,你必须使用 getSerializableExtra
来代替。
的ArrayList<&人GT;人=(ArrayList的<&人GT;)i.getSerializableExtra(personObject);
此君类实现序列化
过,这里是code例如:
人员实现Serializable {
私有静态最后的serialVersionUID长= 0L;
字符串ID;
字符串名称;
}
更新:
另一种解决方案:使用 putParcelableArrayListExtra
和 getParcelableArrayListExtra
。
第一项活动:
的ArrayList<&人GT;名单=新的ArrayList<&人GT;();公共无效onButtonClick(){
意向意图=新意图(getApplicationContext(),SecondActivity.class);
intent.putParcelableArrayListExtra(personObject清单);
startActivity(意向);
}
第二项活动:
的ArrayList<&人GT;人=(ArrayList的<&人GT;)i.getParcelableArrayListExtra(personObject);
请注意: Parcelable
比序列化
更快,所以第二个解决方案是更好,如果你想通过很多数据。
I'm trying to pass an ArrayList of Person Objects from the MainActivity to SecondActivity to print the details of the person in a custom listView adapter.
The application runs but it crashes when it reachesstartActivity()
to the SecondActivity after passing the ArrayList of Persons.
Person implements Parcelable
public Person(String id, String name) {
this.id = id;
this.name = name;
}
public Person(Parcel in) {
id = in.readString();
name = in.readString();
}
public void writeToParcel(Parcel out, int flags) {
out.writeString(id);
out.writeString(name);
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>()
{
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}};
MainActivity
List<Person> list = new ArrayList<Person>();
public void onButtonClick() {
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("personObject", list);
startActivity(intent);
}
SecondClass Activity
protected void onCreate() {
Intent i = getIntent();
ArrayList<Person> person = (ArrayList<Person>) i.getParcelableExtra("personObject");
//Get the Arraylist of Persons from MainActivity
listView.setAdapter(new personAdapter(this, R.layout.person_list_layout, person));
EDIT: stack error trace
E/AndroidRuntime(16698): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testApp/com.example.testApp.SecondActivity}: java.lang.NullPointerException
E/AndroidRuntime(16698): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212)
E/AndroidRuntime(16698): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
E/AndroidRuntime(16698): at android.app.ActivityThread.access$800(ActivityThread.java:144)
E/AndroidRuntime(16698): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
E/AndroidRuntime(16698): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(16698): at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime(16698): at android.app.ActivityThread.main(ActivityThread.java:5146)
E/AndroidRuntime(16698): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(16698): at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(16698): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
E/AndroidRuntime(16698): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
E/AndroidRuntime(16698): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(16698): Caused by: java.lang.NullPointerException
E/AndroidRuntime(16698): at com.example.testApp.SecondActivity.onCreate(SecondActivity.java:35)
E/AndroidRuntime(16698): at android.app.Activity.performCreate(Activity.java:5231)
E/AndroidRuntime(16698): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E/AndroidRuntime(16698): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
EDIT2: Line 35 on error log
listView.setAdapter(new personAdapter(this, R.layout.person_list_layout, person));
ArrayList does not implements Parcelable
, but it implements Serializable
, so you can't use getParcelableExtra
to receive the data, you must use getSerializableExtra
instead.
ArrayList<Person> person = (ArrayList<Person>) i.getSerializableExtra("personObject");
Person class must implements Serializable
too, here is the code example:
Person implements Serializable{
private static final long serialVersionUID = 0L;
String id;
String name;
}
Update:
Another solution: use putParcelableArrayListExtra
and getParcelableArrayListExtra
.
First activity:
ArrayList<Person> list = new ArrayList<Person>();
public void onButtonClick() {
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putParcelableArrayListExtra("personObject", list);
startActivity(intent);
}
Second Activity:
ArrayList<Person> person = (ArrayList<Person>) i.getParcelableArrayListExtra("personObject");
Note: Parcelable
is faster than Serializable
, so the second solution is better if you want to pass a lot of data.
这篇关于对象Parceable的ArrayList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!