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");
希望可以給大家帶來幫助,謝謝。