帮助传递ArrayList和Parcelable Activity
所以我昨天大部分时间都在Google上search,而且最后还是一夜之间,似乎无法把我的脑袋绕过如何将一个数组列表传递给子活动。 有大量的例子和片段传递原始数据types,但我所拥有的是types地址 (address.java)的数组列表。
我已经find了很多东西在stackoverflow和networking上的这个,但没有得到很多的关注,除了一个GeoPoint的例子。 再次,它看起来像他们只是把GeoPoint对象变成两个整数,并通过它。我不能这样做,因为我的地址类可能扩大到包括整数,浮动,不pipe。 现在,下面的testing应用程序只是简单的两个string。 我想如果我能得到parcelalbe的东西,其余的可以跟随。
有人可以发布一个非基本对象的ArrayList的工作示例,或者可能添加下面的代码,使其工作?
更新 :下面的代码现在工作后的答复/编辑。 谢谢!
/* helloParcel.java */ public class helloParcel extends Activity { // holds objects of type 'address' == name and state private ArrayList <address> myList; @Override public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.main); Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(ocl); myList = new ArrayList(); address frank = new address ("frank", "florida"); address mary = new address ("mary", "maryland"); address monty = new address ("monty", "montana"); myList.add (frank); myList.add (mary); myList.add (monty); // add the myList ArrayList() the the extras for the intent } OnClickListener ocl = new OnClickListener() { @Override public void onClick(View v) { // fill parceable and launch activity Intent intent = new Intent().setClass(getBaseContext (), subActivity.class); // for some reason, I remember a posting saying it's best to create a new // object to pass. I have no idea why.. ArrayList <address> addyExtras = new ArrayList <address>(); for (int i = 0; i < myList.size(); i++) addyExtras.add (myList.get(i)); intent.putParcelableArrayListExtra ("mylist", addyExtras); startActivity(intent); } }; } /* address.java */ public class address implements Parcelable { private String name; private String state; private static String TAG = "** address **"; public address (String n, String s) { name = n; state = s; Log.d (TAG, "new address"); } public address (Parcel in) { Log.d (TAG, "parcel in"); name = in.readString (); state = in.readString (); } public String getState () { Log.d (TAG, "getState()"); return (state); } public String getName () { Log.d (TAG, "getName()"); return (name); } public static final Parcelable.Creator<address> CREATOR = new Parcelable.Creator<address>() { public address createFromParcel(Parcel in) { Log.d (TAG, "createFromParcel()"); return new address(in); } public address[] newArray (int size) { Log.d (TAG, "createFromParcel() newArray "); return new address[size]; } }; @Override public int describeContents () { Log.d (TAG, "describe()"); return 0; } @Override public void writeToParcel (Parcel dest, int flags) { Log.d (TAG, "writeToParcel"); dest.writeString (name); dest.writeString (state); } } /* subActivity.java */ public class subActivity extends Activity { private final String TAG = "** subActivity **"; private ArrayList <address> myList; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); Log.d (TAG, "onCreate() in subActivity"); setContentView(R.layout.subactivity); TextView tv1 = (TextView) findViewById(R.id.tv_sub); myList = getIntent().getParcelableArrayListExtra ("mylist"); Log.d (TAG, "got myList"); for (int i = 0; i < myList.size (); i++) { address a = myList.get (i); Log.d (TAG, "state:" + a.getState ()); tv1.setText (a.getName () + " is from " + a.getState ()); } } }
我可以在这里看到一些问题:
-
为什么使用addressParcelable? 为什么不把地址实现为Parcelable,然后使用:
intent.putParcelableArrayListExtra( "addresses", addyExtras );
-
你的parcelable对象必须包含一个静态的CREATOR。 详细信息请参阅文档 。
-
在调用
startActivity()
之前,实际上并没有添加任何附加内容。 这里请参阅第1点的build议。
我认为你需要解决所有这些问题才能使其工作。
它可以做得更简单,没有实现Parcelable
所有痛苦… ArrayList
(但不是任何List
)是可Serializable
。 所以,你可以使用putExtra()
来放置整个列表,并使用putExtra()
检索它,就像Sam所说的那样。
但是,我想添加一个更重要的事情:你的数组列表存储的对象也必须实现Serializable
…以及该对象可能包含的所有其他复杂对象(在你的情况下都不需要)也必须实现它(所以它是recursion的 -为了序列化一个对象,你必须能够序列化所有的字段)。
现在,你可能会问自己,为什么在已经有读写数组列表的可读方法的时候,为了实现Serializable
而不是Parcelable呢? 那么…区别是简单 – 只需添加implements Serializable
和可选的private static final long serialVersionUID = SOME_CONSTANT
,你完成了! 这就是为什么我从来没有使用Parcelable
的原因 – 你可以使用Serializable
和字面上的2行代码来完成所有这些事情 – 而不是许多方法的inheritance和所有这些东西…
你可以通过putExtra传递Serializable对象。 ArrayList实现了Serializable。
Mike dg是正确的!
putExtra()
和getSerializable()
将存储和检索自定义对象的ArrayList<>
,不需要实现接口。 为我工作!