Android—Bundle傳遞ArrayList


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

 希望可以給大家帶來幫助,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM