Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使自定义对象的ArrayList可打包_Android_Android Intent_Parcelable - Fatal编程技术网

Android 使自定义对象的ArrayList可打包

Android 使自定义对象的ArrayList可打包,android,android-intent,parcelable,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(Stri

我有两个类来创建我需要通过意图传递的对象,我目前正试图实现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);
    }
}
导入android.os.packet;
导入android.os.Parcelable;
公共类项实现了Parcelable{
私有字符串名称;
私人双价;
私有整数买方计数=0;
公共项目(字符串名称,双倍价格){
this.name=名称;
这个价格=价格;
}
私人物品(包裹内){
name=in.readString();
price=in.readDouble();
}
public static final Parcelable.Creator=新建Parcelable.Creator(){
公共项目createFromParcel(地块中){
返回新项目(在中);
}
公共项[]新数组(整数大小){
返回新项目[大小];
}
};
@凌驾
公共int描述内容(){
返回0;
}
公开双价{
退货价格;
}
public int getBuyerCount(){
返回买方帐户;
}
public void incrementBuyerCount(){
买方账户+=1;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地书面记录(名称);
目的减记资产(价格);
}
}
从目前为止的测试来看,我的Item对象在绑定时似乎能够正确地传输信息

然而,我的第二类Diner包含一个对象项目的ArrayList,我不确定如何在这个类中正确实现Parcelable,特别是在我评论的部分。我看到有一个readParsableArray()方法,但ArrayList没有

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;
    }

}
导入android.os.packet;
导入android.os.Parcelable;
导入java.util.ArrayList;
公共类餐车实现可包裹{
私有字符串名称;
private ArrayList itemList=new ArrayList();
公共用餐者(字符串名称){
this.name=名称;
}
私人用餐者(包裹内){
name=in.readString();
//如何在ArrayList itemList中读取项对象?
itemList=in.readParcelableArray();
}
public static final Parcelable.Creator=新建Parcelable.Creator(){
公共餐厅createFromParcel(包裹中){
返回新的用餐者(in);
}
公共用餐者[]新阵列(整数大小){
归还新餐车[尺寸];
}
};
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地书面记录(名称);
//如何编写项目对象的ArrayList itemList?
目的地WriteParceableArray(项目列表);
}
公共无效附加项(项目foodItem){
itemList.add(foodItem);
foodItem.incrementBuyerCount();
}
公开双价{
双倍合计=0;
用于(项目:项目列表){
合计+=item.getPrice()/item.getBuyerCount();
}
返回总数;
}
公共字符串toString(){
返回名称;
}
}
使用和
readTypedList

parcel.writeTypedList(yourList);


请注意如何将CREATOR作为参数传入以读取列表。

我建议使用createTypedArrayList,如下所示:

objectsInList = in.createTypedArrayList(ObjectInList.CREATOR)

手工编写可打包的代码容易出错。如果你使用的是Android Studio/IntelliJ,你可以用它来为你做。不幸的是,这是一个学校项目作业,因此,我认为使用外部插件是不受欢迎的。和你的教授谈谈,用一种友好的方式问他/她他们是否希望你按照开发者在现实世界中的方式去做。现在你不需要任何东西,Android Studio为你提供了一个“添加包裹实现”(和删除)。感谢你的回复,但是,当我尝试在.readTypedList(itemList,Item.CREATOR)中使用以下行-itemList=in时,会收到一条不兼容类型的错误消息@user3371750
readTypedList
的返回类型为void,它将填充您传递给它的任何列表。
objectsInList = in.createTypedArrayList(ObjectInList.CREATOR)