通过用户自定义对象的ArrayList到意向安卓 [英] Pass arraylist of user defined objects to Intent android

查看:140
本文介绍了通过用户自定义对象的ArrayList到意向安卓的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想ArrayList的一个结构传递给意向如下, 在调用函数我使用

 的ArrayList<议会> S =(ArrayList的<议会和GT;)msg.obj;
意图I =新的意图(ReadTasks.this,GenrateTasks.class);
i.putExtra(任务,S);
startActivity(ⅰ);
 

而在被调用的函数

 叠B = getIntent()getExtras()。
如果(B!= NULL)
{
    ArrayList的<议会>为=(ArrayList的<议会和GT;)b.getSerializable(任务列表);
}
 

我已实现Serializable在两个班,但我在直接启动活动调用函数越来越无法马歇尔..运行时错误。请帮忙如何处理!

编辑1:堆栈跟踪:

  04-01 22:21:53.999:E / AndroidRuntime(2078):致命异常:主要
04-01 22:21:53.999:E / AndroidRuntime(2078):java.lang.RuntimeException的:包裹:不能编组值com.viralm.readjson.Parliament@413597f0
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.os.Parcel.writeValue(Parcel.java:1137)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.os.Parcel.writeList(Parcel.java:524)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.os.Parcel.writeValue(Parcel.java:1097)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.os.Parcel.writeMapInternal(Parcel.java:493)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.os.Bundle.writeToParcel(Bundle.java:1612)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.os.Parcel.writeBundle(Parcel.java:507)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.content.Intent.writeToParcel(Intent.java:5846)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1606)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.app.Instrumentation.execStartActivity(Instrumentation.java:1379)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.app.Activity.startActivityForResult(Activity.java:3190)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.app.Activity.startActivity(Activity.java:3297)
04-01 22:21:53.999:E / AndroidRuntime(2078):在com.viralm.readjson.ReadTasks $ 1.handleMessage(ReadTasks.java:61)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.os.Handler.dispatchMessage(Handler.java:99)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.os.Looper.loop(Looper.java:137)
04-01 22:21:53.999:E / AndroidRuntime(2078):在android.app.ActivityThread.main(ActivityThread.java:4340)
04-01 22:21:53.999:E / AndroidRuntime(2078):在java.lang.reflect.Method.invokeNative(本机方法)
04-01 22:21:53.999:E / AndroidRuntime(2078):在java.lang.reflect.Method.invoke(Method.java:511)
04-01 22:21:53.999:E / AndroidRuntime(2078):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
04-01 22:21:53.999:E / AndroidRuntime(2078):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-01 22:21:53.999:E / AndroidRuntime(2078):在dalvik.system.NativeStart.main(本机方法)
 

我的Parliment类是有5串,其getter和setter方法​​!

解决方案
  

我已实现Serializable在两个班,但我   越来越无法马歇尔..运行时调用函数中的错误   直接启动活动。请帮忙如何处理!

由于您使用的序列化,你不能像现在这样做。我建议你​​换你的ArrayList类,例如名为 DataWrapper 。这个类还需要实现Serializable接口,然后你可以通过意图传递的ArrayList

例:

 公共类DataWrapper实现Serializable {

   私人的ArrayList<议会>议会;

   公共DataWrapper(ArrayList中<议会和GT;数据){
      this.parliaments =数据;
   }

   公众的ArrayList<议会> getParliaments(){
      返回this.parliaments;
   }

}
 

和一个用法:

 意向书我=新的意图(...);
i.putExtra(数据,新DataWrapper(yourArrayList));
 

和检索:

  DataWrapper DW =(DataWrapper)getIntent()getSerializableExtra(数据)。
ArrayList的<议会>表= dw.getParliaments();
 

注意:

也有选择使用 Parcelable 接口。如果你使用它,你可以把和这些方法检索您的ArrayList

  intent.putParcelableArrayListExtra(钥匙,ArrayList的<吨延伸Parcelable>清单);
。getIntent()getParcelableArrayListExtra(钥匙);
 


一般建议使用直接指定为通过活动传递的对象,但我通常使用的Serializable接口,它总是一招Parcelable接口。

另外要小心约错别字。你是把对象键 工作 ,你应该是相同的密钥并没有与任务列表进行检索。

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);

And in the called function

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!

Edit 1: Stack trace:

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)

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!

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.

Example:

public class DataWrapper implements Serializable {

   private ArrayList<Parliament> parliaments;

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

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

}

And an usage:

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

and retrieving:

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

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");


Generally is recommended to use Parcelable interface that is directly designated for passing objects through Activities but i usually use Serializable interface and it always make a trick.

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

这篇关于通过用户自定义对象的ArrayList到意向安卓的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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