使自定义对象的 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;
    }

}

使用writeTypedListreadTypedList

parcel.writeTypedList(yourList);

parcel.readTypedList(yourList, YourParcelable.CREATOR);

请注意您是如何将 CREATOR 作为参数传递给回读列表的。

我建议使用 createTypedArrayList,像这样:

objectsInList = in.createTypedArrayList(ObjectInList.CREATOR)