对象Parceable的ArrayList [英] Parceable Arraylist of objects

查看:407
本文介绍了对象Parceable的ArrayList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想的人从在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆