Android 中可打包数组 class 的问题

Issues with parcelable array class in Android

我有一个 class,我正尝试使用 parcelable 将其与适配器一起使用。

这些是项目(简要)

public class Stops implements Parcelable{
    private String stop_id;
    private String type;
    private String location;
    private String address;
    private String city;
    private String state;
    private String zip;
    private String from;
    private String to;

    private Commodities[] commodities;

.. etc etc etc

以及解析它的代码:

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeArray(commodities);

}
private Stops(Parcel in){
    commodities = in.readArray(); // the error is right here
}
public static final Creator<Stops> CREATOR = new Creator<Stops>(){
    @Override
    public Stops createFromParcel(Parcel source) {
        return new Stops(source);
    }
    @Override
    public Stops[] newArray(int size){
        return new Stops[size];
    }
};

我在

上遇到错误
private Stops(Parcel in){
    commodities = in.readArray();
}

一些解决方案涉及将 dest.writeArray() 更改为 dest.writeParcelable(etc etc) 尽管这样做 给我一个奇怪的错误,说我没有传递 parcelable(商品有自己的 class 定义,它被设为 parcelable....这就是错误让我失望的原因)

那么最好的选择是什么?

要求的商品class:

public class Commodities  implements Parcelable{
    private String item;
    private String description;
    private String poNumber;
    private String qty;
    private String weight;

    public Commodities() {}

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getPoNumber() {
        return poNumber;
    }

    public void setPoNumber(String poNumber) {
        this.poNumber = poNumber;
    }

    public String getQty() {
        return qty;
    }

    public void setQty(String qty) {
        this.qty = qty;
    }

    public String getWeight() {
        return weight;
    }

    public void setWeight(String weight) {
        this.weight = weight;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(item);
        dest.writeString(description);
        dest.writeString(poNumber);
        dest.writeString(qty);
        dest.writeString(weight);
    }
    private Commodities(Parcel in){
        item = in.readString();
        description  =in.readString();
        poNumber = in.readString();
        qty = in.readString();
        weight = in.readString();
    }

    public static final Creator<Commodities> CREATOR = new Creator<Commodities>() {
        @Override
        public Commodities createFromParcel(Parcel source) {
            return new Commodities(source);
        }
        @Override
        public Commodities[] newArray(int size) {
            return new Commodities[size];}
    };
}

并提供更多关于我正在尝试做的事情的背景信息。有各种停靠点(它也是一个数组),里面有一系列商品。相应地填充止损和商品。我要做的是将此信息发送到 recyclerview 适配器。

所以每个站点都是一个包含各种数据的数组,其中一部分是另一个商品数组。

您需要为自定义对象调用 CREATER

 public class Stops implements Parcelable {

    private String stop_id;
    private String type;
    private String location;
    private String address;
    private String city;
    private String state;
    private String zip;
    private String from;
    private String to;
    private Commodities[] commodities;


   protected Stops(Parcel in) {
    stop_id = in.readString();
    type = in.readString();
    location = in.readString();
    address = in.readString();
    city = in.readString();
    state = in.readString();
    zip = in.readString();
    from = in.readString();
    to = in.readString();
    commodities = in.createTypedArray(Commodities.CREATOR);
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(stop_id);
    dest.writeString(type);
    dest.writeString(location);
    dest.writeString(address);
    dest.writeString(city);
    dest.writeString(state);
    dest.writeString(zip);
    dest.writeString(from);
    dest.writeString(to);
    dest.writeTypedArray(commodities, flags);
}

@Override
public int describeContents() {
    return 0;
}

public static final Creator<Stops> CREATOR = new Creator<Stops>() {
    @Override
    public Stops createFromParcel(Parcel in) {
        return new Stops(in);
    }

    @Override
    public Stops[] newArray(int size) {
        return new Stops[size];
    }
};
}