zoukankan      html  css  js  c++  java
  • 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");
    

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

  • 相关阅读:
    单例模式及C++实现代码
    Nginx学习笔记4 源码分析
    探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别2
    SVM学习资料
    11 款最好 CSS 框架
    发布Activex全过程
    Integer.parseInt(String s, int radix)方法介绍(修正版)
    Windows 各种计时函数总结(QueryPerformanceCounter可以达到微秒)
    不断摸索发现用 andy 模拟器很不错,感觉跟真机差不多
    Qt中提高sqlite的读写速度(使用事务一次性写入100万条数据)
  • 原文地址:https://www.cnblogs.com/yunfang/p/5431435.html
Copyright © 2011-2022 走看看