Android开发中Activity传值特别普遍,最贱开发需要传递集合List到另一个Activity,在此作出总结。

首先创建自己的实体类:我的暂命名为Gate。

声明List集合时候泛型中是你声明的实体类:List gates=new ArrayList;

我们要做的是将这个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 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 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");

希望可以给大家带来帮助,谢谢。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐