Android—Bundle传递ArrayList<T>
Android开发中Activity传值特别普遍,最贱开发需要传递集合List到另一个Activity,在此作出总结。
首先创建自己的实体类:我的暂命名为Gate。
声明List集合时候泛型中是你声明的实体类:List<Gate> gates=new ArrayList<Gate>;
我们要做的是将这个gates传递到要跳转的Activity,用到的方法是bundle.putParcelableArrayList("gates", gates)
如果你的尸体类只是声明变量以及添加对应的构造函数和set get方法,直接用以上方法传递集合会报错的,因为bundle.putParcelableArrayList("gates", gates)这个方法要求是集合中的泛型必须实现Parcelable接口;
所以我们的实体类应该如下:
package com.example.galleryapp.domain;
import android.os.Parcel;
import android.os.Parcelable;
public class Gate implements Parcelable{
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Gate(String id, String name) {
super();
this.id = id;
this.name = name;
}
public Gate() {
super();
}
@Override
public String toString() {
return "Gate [id=" + id + ", name=" + name + "]";
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel arg0, int arg1) {
// TODO Auto-generated method stub
// 1.必须按成员变量声明的顺序封装数据,不然会出现获取数据出错
// 2.序列化对象
arg0.writeString(id);
arg0.writeString(name);
}
// 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
// android.os.BadParcelableException:
// Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.um.demo.Person
// 2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
// 3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
// 4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
// 5.反序列化对象
public static final Parcelable.Creator<Gate> CREATOR = new Creator(){
@Override
public Gate createFromParcel(Parcel source) {
// TODO Auto-generated method stub
// 必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
Gate p = new Gate();
p.setId(source.readString());
p.setName(source.readString());
return p;
}
@Override
public Gate[] newArray(int size) {
// TODO Auto-generated method stub
return new Gate[size];
}
};
}
以上的重点是实现了Parcelable接口,并且重写了其中的方法。
重点代码:
@Override
public void writeToParcel(Parcel arg0, int arg1) {
// TODO Auto-generated method stub
// 1.必须按成员变量声明的顺序封装数据,不然会出现获取数据出错
// 2.序列化对象
arg0.writeString(id);
arg0.writeString(name);
}
// 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
// android.os.BadParcelableException:
// Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.um.demo.Person
// 2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
// 3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
// 4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
// 5.反序列化对象
public static final Parcelable.Creator<Gate> CREATOR = new Creator(){
@Override
public Gate createFromParcel(Parcel source) {
// TODO Auto-generated method stub
// 必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
Gate p = new Gate();
p.setId(source.readString());
p.setName(source.readString());
return p;
}
@Override
public Gate[] newArray(int size) {
// TODO Auto-generated method stub
return new Gate[size];
}
};
详细请阅读注释,如果没有以上两端代码,传值一样会失败。
传值:
Intent intent = new Intent(LoginActivity.this,
PeizhiActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("gates", gates);
intent.putExtras(bundle);
startActivity(intent);
接收:
Bundle bundle = getIntent().getExtras();
gates = bundle.getParcelableArrayList("gates");
希望可以给大家带来帮助,谢谢。