以下に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 ???????;
}
}
クラスProduct
がパーセル可能なプロトコルと互換性がある場合、以下のドキュメントに従って動作するはずです。
products = new ArrayList<Product>();
in.readList(products, Product.class.getClassLoader());
まず、ProductオブジェクトはParcelable
を実装する必要があります。
そして、dest.writeTypedList(products)
メソッドでwriteToParcel()
を使用します。
最後に、次のコードを使用してリストを解析します。
products = new ArrayList<Product>();
in.readTypedList(products, Product.CREATOR);
詳細については、 公式ドキュメント を参照してください。
これは動作するはずです:
in.readTypedList(products, Product.CREATOR);
私の個人的な経験では、 http://www.parcelabler.com/ はこのための素晴らしいサイトです。クラスを作成し、それをコピーしてWebサイトに貼り付けるだけで、クラスのParcelableバージョンが生成されます。
次の変数を含む「テーマ」という名前のクラスでテストしました。
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;
}
}
編集:カードオブジェクトもパーセル可能であることを確認してください!
もう1つの方法は、 readValue & writeValue を使用することです。
protected Product (Parcel in) {
...
in.readValue(this.getClass().getClassLoader());
}
@Override
public void writeToParcel(Parcel parcel, int i) {
...
parcel.writeValue(**list**);
}
listの項目はParcelableを実装する必要があります
productクラスにもParcelable
を実装してから
in.readList(this.list, Product.class.getClassLoader());
上記の解決策のいずれかが機能しなかった場合。
ここに行く...
「Products.Java」がParcelableで拡張されていることを確認してください
ステップ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);
}
Product
がParcelable
を実装していると仮定すると、これを記述に使用できます。
dest.writeValue(products);
そしてこれを読むために:
products = (List<Product>) in.readValue(Product.class.getClassLoader());