web-dev-qa-db-fra.com

Comment passer un objet parcellable contenant une liste d'objets?

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 ???????;
    }
}
83
Byron

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());
91
Alex Gitelman

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

35
codezjx

Cela devrait fonctionner:

in.readTypedList(products, Product.CREATOR);
5
user3875399

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!

4
Pieter Desseyn

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

1
BlackRainbow

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());
0
arenaq

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);
    }
0
Shyam Kumar