我在下面创建了一个Parcelable
对象,我的对象包含List
个产品。在我的构造函数中,如何处理为Parcelable
重新创建List
?
我检查了包裹中的所有可用方法,所有可用的方法都是readArrayList(ClassLoader)
。我不确定这是否是最好的方法,我的建议真的很值得赞赏。
public class Outfits implements Parcelable {
private String url;
private String name;
private List<Product> 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<Product> getProducts() {
return products;
}
public void setProducts(List<Product> 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 ???????;
}
}
答案 0 :(得分:93)
如果类Product
与parcelable协议兼容,则以下内容应根据文档进行操作。
products = new ArrayList<Product>();
in.readList(products, Product.class.getClassLoader());
答案 1 :(得分:35)
首先,您的Product对象必须实现Parcelable
。
然后,在dest.writeTypedList(products)
方法中使用writeToParcel()
。
最后,使用以下代码来解析列表:
products = new ArrayList<Product>();
in.readTypedList(products, Product.CREATOR);
有关详细信息,请参阅Official Document:
答案 2 :(得分:5)
这应该有效:
in.readTypedList(products, Product.CREATOR);
答案 3 :(得分:5)
以我的个人经验,http://www.parcelabler.com/是一个很棒的网站。您只需创建您的课程,然后将其复制粘贴到网站中,即可生成该课程的Parcelable版本。
我使用名为“ Theme”的类对其进行了测试,该类包含以下变量:
private String name;
private int image;
private List<Card> 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<Card>();
in.readList(cards, Card.class.getClassLoader());
} else {
cards = null;
}
}
编辑:确保Card对象也是可包裹的!
答案 4 :(得分:1)
在Product类上实现Parcelable
,然后
in.readList(this.list, Product.class.getClassLoader());
如果上述任何解决方案都无效。
答案 5 :(得分:1)
另一种方法是使用readValue&amp; writeValue。
protected Product (Parcel in) {
...
in.readValue(this.getClass().getClassLoader());
}
@Override
public void writeToParcel(Parcel parcel, int i) {
...
parcel.writeValue(**list**);
}
列表的项目应实现Parcelable
答案 6 :(得分:1)
您在这里...
确保应使用Parcelable扩展“ Products.java”
第1步:
private List<Products> products;
第2步:
private Outfits(Parcel in) {
products = in.createTypedArrayList(Products.CREATOR);
}
第3步:
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedList(products);
}
答案 7 :(得分:0)
假设Product
正在实现Parcelable
,则可以使用它来编写:
dest.writeValue(products);
此内容可供阅读:
products = (List<Product>) in.readValue(Product.class.getClassLoader());
答案 8 :(得分:0)
产品必须是可打包的
Product class implements Parcelable {
......
}
然后写您对象包含类似列表
public class Outfits implements Parcelable {
private String url;
private String name;
private List<Product> products;
public Outfits (Parcel pi) {
bookName = p.readString();
bookId = p.readInt();
isColor = p.readInt() == 1;
//use this well be get err
//products=p.readArrayList(Thread.currentThread().getContextClassLoader());
//Pass list use this
products= in.createTypedArrayList(Product.CREATOR);
}
...get and set...
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(url);
dest.writeString(name);
//use this will no working
//dest.writeList(products);
//Parcelable list
out.writeTypedList(products);
}
}