使自定义对象的 ArrayList 可打包
Making ArrayList of custom objects parcelable
我有两个 class 创建我需要通过意图传递的对象,我目前正在尝试实现 Parcelable 来执行此操作。
import android.os.Parcel;
import android.os.Parcelable;
public class Item implements Parcelable {
private String name;
private double price;
private int buyerCount = 0;
public Item(String name, double price) {
this.name = name;
this.price = price;
}
private Item(Parcel in) {
name = in.readString();
price = in.readDouble();
}
public static final Parcelable.Creator<Item> CREATOR = new Parcelable.Creator<Item>() {
public Item createFromParcel(Parcel in) {
return new Item(in);
}
public Item[] newArray(int size) {
return new Item[size];
}
};
@Override
public int describeContents() {
return 0;
}
public double getPrice() {
return price;
}
public int getBuyerCount() {
return buyerCount;
}
public void incrementBuyerCount() {
buyerCount += 1;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeDouble(price);
}
}
从目前的测试来看,我的 Item 对象在捆绑时似乎可以正确传输信息。
但是我的第二个 class Diner 包含对象项目的 ArrayList,我不确定如何在此 class 中正确实施 Parcelable,特别是在我评论过的部分。我看到有一个 readParsableArray() 方法,但没有用于 ArrayLists 的方法。
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
public class Diner implements Parcelable {
private String name;
private ArrayList<Item> itemList = new ArrayList<Item>();
public Diner(String name) {
this.name = name;
}
private Diner(Parcel in) {
name = in.readString();
// How to read in ArrayList itemList of item objects?
itemList = in.readParcelableArray();
}
public static final Parcelable.Creator<Diner> CREATOR = new Parcelable.Creator<Diner>() {
public Diner createFromParcel(Parcel in) {
return new Diner(in);
}
public Diner[] newArray(int size) {
return new Diner[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
// How to write ArrayList itemList of item objects?
dest.writeParcelableArray(itemList);
}
public void addItem(Item foodItem) {
itemList.add(foodItem);
foodItem.incrementBuyerCount();
}
public double getPrice() {
double total = 0;
for(Item item : itemList) {
total += item.getPrice() / item.getBuyerCount();
}
return total;
}
public String toString() {
return name;
}
}
使用writeTypedList和readTypedList
。
parcel.writeTypedList(yourList);
和
parcel.readTypedList(yourList, YourParcelable.CREATOR);
请注意您是如何将 CREATOR 作为参数传递给回读列表的。
我建议使用 createTypedArrayList,像这样:
objectsInList = in.createTypedArrayList(ObjectInList.CREATOR)
我有两个 class 创建我需要通过意图传递的对象,我目前正在尝试实现 Parcelable 来执行此操作。
import android.os.Parcel;
import android.os.Parcelable;
public class Item implements Parcelable {
private String name;
private double price;
private int buyerCount = 0;
public Item(String name, double price) {
this.name = name;
this.price = price;
}
private Item(Parcel in) {
name = in.readString();
price = in.readDouble();
}
public static final Parcelable.Creator<Item> CREATOR = new Parcelable.Creator<Item>() {
public Item createFromParcel(Parcel in) {
return new Item(in);
}
public Item[] newArray(int size) {
return new Item[size];
}
};
@Override
public int describeContents() {
return 0;
}
public double getPrice() {
return price;
}
public int getBuyerCount() {
return buyerCount;
}
public void incrementBuyerCount() {
buyerCount += 1;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeDouble(price);
}
}
从目前的测试来看,我的 Item 对象在捆绑时似乎可以正确传输信息。
但是我的第二个 class Diner 包含对象项目的 ArrayList,我不确定如何在此 class 中正确实施 Parcelable,特别是在我评论过的部分。我看到有一个 readParsableArray() 方法,但没有用于 ArrayLists 的方法。
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
public class Diner implements Parcelable {
private String name;
private ArrayList<Item> itemList = new ArrayList<Item>();
public Diner(String name) {
this.name = name;
}
private Diner(Parcel in) {
name = in.readString();
// How to read in ArrayList itemList of item objects?
itemList = in.readParcelableArray();
}
public static final Parcelable.Creator<Diner> CREATOR = new Parcelable.Creator<Diner>() {
public Diner createFromParcel(Parcel in) {
return new Diner(in);
}
public Diner[] newArray(int size) {
return new Diner[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
// How to write ArrayList itemList of item objects?
dest.writeParcelableArray(itemList);
}
public void addItem(Item foodItem) {
itemList.add(foodItem);
foodItem.incrementBuyerCount();
}
public double getPrice() {
double total = 0;
for(Item item : itemList) {
total += item.getPrice() / item.getBuyerCount();
}
return total;
}
public String toString() {
return name;
}
}
使用writeTypedList和readTypedList
。
parcel.writeTypedList(yourList);
和
parcel.readTypedList(yourList, YourParcelable.CREATOR);
请注意您是如何将 CREATOR 作为参数传递给回读列表的。
我建议使用 createTypedArrayList,像这样:
objectsInList = in.createTypedArrayList(ObjectInList.CREATOR)