Android 使自定义对象的ArrayList可打包
我有两个类来创建我需要通过意图传递的对象,我目前正试图实现Parcelable来实现这一点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
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)