Activity 间传递 ArrayList
转自:http://www.eoeandroid.com/thread-161416-1-1.html
Activity之间简单的数据传递,可能经常用,今天遇到要传递一个ArrayList<MyClass>的问题。
花费了一点时间搞定,也学习了一些东西。再次记录以下。
1. 使用 Serializable 方法
将类的实例序列化然后再做存储或者传输在JAVA中较为常见,在Android也可用。
具体看代码吧,比较简单。
一个自定义类,实现Serializable接口。
一个Activity中传递。
另一个Activity中接收
2. 使用Parcelable 方法
Android内存受限,迫使其封装了Parcel容器来替代Serializable方法。
代码中做了一些注释,这里就不再解释了。
一个自定义类,注释中又说明,看代码。
发送
接收。
Activity之间简单的数据传递,可能经常用,今天遇到要传递一个ArrayList<MyClass>的问题。
花费了一点时间搞定,也学习了一些东西。再次记录以下。
1. 使用 Serializable 方法
将类的实例序列化然后再做存储或者传输在JAVA中较为常见,在Android也可用。
具体看代码吧,比较简单。
public class MyClass implements Serializable{ private static final long serialVersionUID = 1L; public String userName; public String psw; public int age; }
一个自定义类,实现Serializable接口。
findViewById(R.id.send_arraylist_button).setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub ArrayList<MyClass> arrayList = new ArrayList<MyClass>(); for (int i = 0; i < 10; i++) { MyClass myClass = new MyClass(); myClass.userName = "a" + i; myClass.psw = "b" + i; myClass.age = 10 + i; arrayList.add(myClass); } Intent intent = new Intent(); intent.putExtra("key", arrayList); intent.setClass(MainActivity.this, ResultActivity.class); startActivity(intent); } });
一个Activity中传递。
ArrayList<MyClass> arrayList = (ArrayList<MyClass>) getIntent().getSerializableExtra("key"); String result = "" ; for (MyClass myClass : arrayList) { result += myClass.userName + "--" + myClass.psw + "--" + myClass.age + "\n"; } ((TextView)findViewById(R.id.show_result_textview)).setText(result);
另一个Activity中接收
2. 使用Parcelable 方法
Android内存受限,迫使其封装了Parcel容器来替代Serializable方法。
代码中做了一些注释,这里就不再解释了。
/** * Parcel类:http://developer.android.com/reference/android/os/Parcel.html <br> * 封装数据的容器,封装后的数据可以通过Intent或IPC传递 <br> * * Parcelable接口:http://developer.android.com/reference/android/os/Parcelable.html <br> * 自定义类继承该接口后,其实例化后能够被写入Parcel或从Parcel中恢复。 <br> * * 如果某个类实现了这个接口,那么它的对象实例可以写入到 Parcel 中,并且能够从中恢复, * 并且这个类必须要有一个 static 的 field ,并且名称要为 CREATOR ,这个 field 是某个实现了 Parcelable.Creator 接口的类的对象实例。 */ public class MyClass2 implements Parcelable{ public String userName; public String psw; public int age; //静态的Parcelable.Creator接口 public static final Parcelable.Creator<MyClass2> CREATOR = new Creator<MyClass2>() { //创建出类的实例,并从Parcel中获取数据进行实例化 public MyClass2 createFromParcel(Parcel source) { MyClass2 myClass2 = new MyClass2(); myClass2.userName = source.readString(); myClass2.psw = source.readString(); myClass2.age = source.readInt(); return myClass2; } public MyClass2[] newArray(int size) { // TODO Auto-generated method stub return new MyClass2[size]; } }; // @Override public int describeContents() { // TODO Auto-generated method stub return 0; } //将数据写入外部提供的Parcel中 @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeString(userName); dest.writeString(psw); dest.writeInt(age); } }
一个自定义类,注释中又说明,看代码。
//use Parcelable findViewById(R.id.send_arraylist_button).setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub ArrayList<MyClass2> arrayList = new ArrayList<MyClass2>(); for (int i = 0; i < 10; i++) { MyClass2 myClass2 = new MyClass2(); myClass2.userName = "a" + i; myClass2.psw = "b" + i; myClass2.age = 10 + i; arrayList.add(myClass2); } Intent intent = new Intent(); intent.putParcelableArrayListExtra("key", arrayList); intent.setClass(MainActivity.this, ResultActivity.class); startActivity(intent); } });
发送
//use Parcelable ArrayList<MyClass2> arrayList = (ArrayList<MyClass2>) getIntent().getSerializableExtra("key"); String result = "" ; for (MyClass2 myClass2 : arrayList) { result += myClass2.userName + "--" + myClass2.psw + "--" + myClass2.age + "\n"; } ((TextView)findViewById(R.id.show_result_textview)).setText(result);
接收。