J'ai créé un objet Parcelable
ci-dessous, mon objet contient une List
de produits. Dans mon constructeur, comment gérer la recréation de ma Parcelable
pour la List
?
J'ai vérifié toutes les méthodes disponibles dans le colis et tout ce qui est disponible est readArrayList(ClassLoader)
. Je ne suis pas sûr que ce soit la meilleure approche, votre avis serait vraiment apprécié.
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 ???????;
}
}
Si la classe Product
est compatible avec le protocole parcelable, ce qui suit devrait fonctionner conformément à la documentation.
products = new ArrayList<Product>();
in.readList(products, Product.class.getClassLoader());
Tout d'abord, votre objet Product doit implémenter Parcelable
.
Et ensuite, utilisez dest.writeTypedList(products)
dans la méthode writeToParcel()
.
Enfin, utilisez le code suivant pour analyser la liste:
products = new ArrayList<Product>();
in.readTypedList(products, Product.CREATOR);
Pour plus d'informations, veuillez vous référer au Document officiel :
Cela devrait fonctionner:
in.readTypedList(products, Product.CREATOR);
D'après mon expérience personnelle, http://www.parcelabler.com/ est un site extraordinaire pour cela. Vous venez de créer votre classe et de la copier-coller sur le site Web, ce qui génère une version parcellaire de votre classe.
Je l'ai testé avec une classe nommée "Theme" contenant les variables suivantes:
private String name;
private int image;
private List<Card> cards;
La fonction writeToParcel devient:
@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);
}
}
constructeur généré:
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;
}
}
EDIT: assurez-vous que l'objet Card est également Parcelable!
L'autre façon consiste à utiliser readValue & writeValue .
protected Product (Parcel in) {
...
in.readValue(this.getClass().getClassLoader());
}
@Override
public void writeToParcel(Parcel parcel, int i) {
...
parcel.writeValue(**list**);
}
Les éléments de la liste doivent implémenter Parcelable
En supposant que Product
implémente Parcelable
, vous pouvez l’utiliser pour écrire:
dest.writeValue(products);
et ceci pour la lecture:
products = (List<Product>) in.readValue(Product.class.getClassLoader());
Voici...
Assurez-vous que "Products.Java" doit être étendu avec Parcelable
Étape 1:
private List<Products> products;
Étape 2:
private Outfits(Parcel in) {
products = in.createTypedArrayList(Products.CREATOR);
}
Étape 3:
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedList(products);
}