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

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

posted @ 2016-04-25 16:31  奋斗者—cyf  阅读(30518)  评论(0编辑  收藏  举报