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