android表对象,android - 如何传递包含对象列表的parcelable对象?

android - 如何传递包含对象列表的parcelable对象?

我在下面创建了一个readArrayList(ClassLoader)对象,我的对象包含一个List的产品。 在我的构造函数中如何处理为List重新创建我的Parcelable?

我检查了包裹中可用的所有方法,所有可用的方法是readArrayList(ClassLoader).我不确定这是否是最佳方法,您的建议真的很值得赞赏。

public class Outfits implements Parcelable {

private String url;

private String name;

private List products;

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public List getProducts() {

return products;

}

public void setProducts(List products) {

this.products = products;

}

public void writeToParcel(Parcel dest, int flags) {

Log.v("", "writeToParcel..." + flags);

dest.writeString(url);

dest.writeString(name);

dest.writeList(products);

}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

public Outfits createFromParcel(Parcel in) {

return new Outfits(in);

}

public Outfits[] newArray(int size) {

return new Outfits[size];

}

};

@Override

public int describeContents() {

return 0;

}

/*** Here how do I populate my List of Products ***/

private Outfits(Parcel in) {

url = in.readString();

name = in.readString();

products = in.read ???????;

}

}

8个解决方案

93 votes

如果类Product与parcelable协议兼容,则以下内容应根据文档进行操作。

products = new ArrayList();

in.readList(products, Product.class.getClassLoader());

Alex Gitelman answered 2019-09-12T23:38:45Z

35 votes

首先,您的Product对象必须实现dest.writeTypedList(products)。

然后,在writeToParcel()方法中使用dest.writeTypedList(products)。

最后,使用以下代码来解析列表:

products = new ArrayList();

in.readTypedList(products, Product.CREATOR);

有关更多信息,请参阅官方文件:

codezjx answered 2019-09-12T23:39:30Z

5 votes

这应该工作:

in.readTypedList(products, Product.CREATOR);

user3875399 answered 2019-09-12T23:39:50Z

5 votes

根据我的个人经验,[http://www.parcelabler.com/]是一个令人惊叹的网站。 您只需创建您的类,然后将其粘贴到网站中,然后生成您的类的Parcelable版本。

我用名为“Theme”的类测试了它,其中包含以下变量:

private String name;

private int image;

private List cards;

writeToParcel函数变为:

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(name);

dest.writeInt(image);

if (cards == null) {

dest.writeByte((byte) (0x00));

} else {

dest.writeByte((byte) (0x01));

dest.writeList(cards);

}

}

生成的构造函数:

protected Theme(Parcel in) {

name = in.readString();

image = in.readInt();

if (in.readByte() == 0x01) {

cards = new ArrayList();

in.readList(cards, Card.class.getClassLoader());

} else {

cards = null;

}

}

编辑:确保Card对象也是Parcelable!

Pieter Desseyn answered 2019-09-12T23:40:41Z

1 votes

在Product类上实现in.readList(this.list, Product.class.getClassLoader());然后

in.readList(this.list, Product.class.getClassLoader());

如果上述任何解决方案都不起作用。

Faisal Naseer answered 2019-09-12T23:41:19Z

1 votes

另一种方法是使用readValue和writeValue。

protected Product (Parcel in) {

...

in.readValue(this.getClass().getClassLoader());

}

@Override

public void writeToParcel(Parcel parcel, int i) {

...

parcel.writeValue(**list**);

}

列表中的项应该实现Parcelable

BlackRainbow answered 2019-09-12T23:41:51Z

0 votes

干得好...

确保“Products.java”应该使用Parcelable进行扩展

步骤1:

private List products;

第2步:

private Outfits(Parcel in) {

products = in.createTypedArrayList(Products.CREATOR);

}

第3步:

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeTypedList(products);

}

Shyam Kumar answered 2019-09-12T23:42:42Z

0 votes

假设Product正在实现Parcelable,您可以使用它来编写:

dest.writeValue(products);

这用于阅读:

products = (List) in.readValue(Product.class.getClassLoader());

arenaq answered 2019-09-12T23:43:15Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值