it-swarm.com.de

Wie übergeben Sie ein Parcelable-Objekt, das eine Liste von Objekten enthält?

Ich habe unten ein Parcelable-Objekt erstellt. Mein Objekt enthält eine List von Produkten. Wie gehe ich in meinem Konstruktor vor, um meine Parcelable für die List neu zu erstellen?

Ich habe alle verfügbaren Methoden aus dem Paket geprüft und alles, was zur Verfügung steht, ist readArrayList(ClassLoader). Ich bin mir nicht sicher, ob dies der beste Ansatz ist, Ihr Rat wäre wirklich dankbar.

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

Wenn die Klasse Product mit dem Parcelable-Protokoll kompatibel ist, sollte Folgendes laut Dokumentation funktionieren.

products = new ArrayList<Product>();
in.readList(products, Product.class.getClassLoader());
91
Alex Gitelman

Zunächst muss Ihr Product-Objekt Parcelable implementieren.

Verwenden Sie dann dest.writeTypedList(products) in der writeToParcel()-Methode.

Verwenden Sie schließlich folgenden Code, um die Liste zu analysieren:

products = new ArrayList<Product>();
in.readTypedList(products, Product.CREATOR);

Weitere Informationen finden Sie im Official Document

35
codezjx

Das sollte funktionieren:

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

Nach meiner persönlichen Erfahrung ist http://www.parcelabler.com/ eine erstaunliche Website dafür. Sie erstellen einfach Ihre Klasse und fügen sie in die Website ein. Sie generiert eine Parcelable-Version Ihrer Klasse.

Ich habe es mit einer Klasse namens "Theme" getestet, die die folgenden Variablen enthielt:

private String name;
private int image;
private List<Card> cards;

Die writeToParcel-Funktion wird zu:

@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);
    }
}

generierter Konstruktor:

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;
    }
}

BEARBEITEN: Stellen Sie sicher, dass das Kartenobjekt auch Parcelable ist!

4
Pieter Desseyn

Die andere Möglichkeit ist die Verwendung von readValue & writeValue

protected Product (Parcel in) {
        ...
        in.readValue(this.getClass().getClassLoader());
    }

@Override
public void writeToParcel(Parcel parcel, int i) {
    ...
    parcel.writeValue(**list**);
}

Elemente der list sollten Parcelable implementieren

1
BlackRainbow

implementieren Sie Parcelable auch in der Produktklasse und dann

in.readList(this.list, Product.class.getClassLoader());

wenn eine der oben genannten Lösungen nicht funktioniert.

1
Faisal Naseer

Angenommen, die Variable Product implementiert Parcelable, können Sie dies zum Schreiben verwenden:

dest.writeValue(products);

und das zum Lesen:

products = (List<Product>) in.readValue(Product.class.getClassLoader());
0
arenaq

Bitte schön...

Stellen Sie sicher, dass "Products.Java" mit Parcelable erweitert wird

Schritt 1: 

 private List<Products> products; 

Schritt 2:

private Outfits(Parcel in) {
    products = in.createTypedArrayList(Products.CREATOR);
}

Schritt 3:

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeTypedList(products);
    }
0
Shyam Kumar