使自定义对象的ArrayList可分配

时间:2015-03-06 15:44:17

标签: android android-intent parcelable

我有两个类创建我需要传递意图的对象,我目前正在尝试实现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对象似乎在捆绑它时正确传输信息。

但是我的第二个类Diner包含一个对象的ArrayList,我不确定如何在这个类中正确实现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;
    }

}

2 个答案:

答案 0 :(得分:19)

使用writeTypedListreadTypedList

parcel.writeTypedList(yourList);

parcel.readTypedList(yourList, YourParcelable.CREATOR);

注意你如何传递CREATOR作为读回列表的参数。

答案 1 :(得分:0)

我建议使用 createTypedArrayList ,像这样:

objectsInList = in.createTypedArrayList(ObjectInList.CREATOR)