将用户定义对象的数组列表传递给 Intent android [英] Pass arraylist of user defined objects to Intent android

查看:24
本文介绍了将用户定义对象的数组列表传递给 Intent android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将 arraylist 的结构传递给一个意图,如下所示,在调用函数中我使用

I am trying to pass a structure of arraylist to an intent as follows, In the calling function i am using

ArrayList<Parliament> s=(ArrayList<Parliament>)msg.obj;                                 
Intent i = new Intent(ReadTasks.this, GenrateTasks.class);                          
i.putExtra("tasks", s);
startActivity(i);

在被调用的函数中

Bundle b = getIntent().getExtras();
if(b!=null)
{           
    ArrayList<Parliament> as = (ArrayList<Parliament>)b.getSerializable("tasklist");
}

我在两个类中都给出了可序列化的实现,但是我无法在行开始活动的调用函数中编组..运行时错误.请帮助如何进行!

I have given implements serializable in both the classes, but am getting unable to marshall.. run time error in the calling function at line start activity. Please help how to proceed with!

编辑 1:堆栈跟踪:

04-01 22:21:53.999: E/AndroidRuntime(2078): FATAL EXCEPTION: main
04-01 22:21:53.999: E/AndroidRuntime(2078): java.lang.RuntimeException: Parcel: unable to marshal value com.viralm.readjson.Parliament@413597f0
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Parcel.writeValue(Parcel.java:1137)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Parcel.writeList(Parcel.java:524)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Parcel.writeValue(Parcel.java:1097)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Parcel.writeMapInternal(Parcel.java:493)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Bundle.writeToParcel(Bundle.java:1612)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Parcel.writeBundle(Parcel.java:507)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.content.Intent.writeToParcel(Intent.java:5846)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1606)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1379)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.app.Activity.startActivityForResult(Activity.java:3190)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.app.Activity.startActivity(Activity.java:3297)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at com.viralm.readjson.ReadTasks$1.handleMessage(ReadTasks.java:61)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Looper.loop(Looper.java:137)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.app.ActivityThread.main(ActivityThread.java:4340)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at java.lang.reflect.Method.invokeNative(Native Method)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at java.lang.reflect.Method.invoke(Method.java:511)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at dalvik.system.NativeStart.main(Native Method)

我的 Parliment 类有 5 个字符串及其 setter 和 getter!

My Parliment class is having 5 strings with its setters and getters!

推荐答案

我在两个类中都给出了可序列化的实现,但是我无法编组.. 调用函数中的运行时错误行开始活动.请帮助如何进行!

I have given implements serializable in both the classes, but am getting unable to marshall.. run time error in the calling function at line start activity. Please help how to proceed with!

由于您使用的是 Serializable,因此您不能像现在这样使用.我建议您将 ArrayList 包装到名为 DataWrapper 的类中.这个类还需要实现Serializable,然后才能通过Intent传递ArrayList.

Since you are using Serializable, you cannot do it like now. I suggest you to wrap your ArrayList to class for example named DataWrapper. This class also needs to implement Serializable and then you are able to pass ArrayList via Intent.

public class DataWrapper implements Serializable {

   private ArrayList<Parliament> parliaments;

   public DataWrapper(ArrayList<Parliament> data) {
      this.parliaments = data;
   }

   public ArrayList<Parliament> getParliaments() {
      return this.parliaments;
   }

}

还有一个用法:

Intent i = new Intent(...);
i.putExtra("data", new DataWrapper(yourArrayList));

并检索:

DataWrapper dw = (DataWrapper) getIntent().getSerializableExtra("data");
ArrayList<Parliament> list = dw.getParliaments();

注意:

还可以选择使用 Parcelable 界面.如果您将使用它,您可以使用以下方法放置和检索您的 ArrayList:

Note:

There is also option to use Parcelable interface. If you will use it, you can put and retrieve your ArrayList with these methods:

intent.putParcelableArrayListExtra("key", ArrayList<T extends Parcelable> list);
getIntent().getParcelableArrayListExtra("key");


一般推荐使用 Parcelable 接口,它直接指定用于通过活动传递对象,但我通常使用 Serializable 接口,它总是有技巧.

还要注意错别字.您正在使用键 task 放置对象,您应该使用 相同的键 而不是使用 tasklist 检索它.

Also be carefull about typos. You are putting object with key task and you should retrieve it with same key and not with tasklist.

这篇关于将用户定义对象的数组列表传递给 Intent android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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