Bir nesne listesi içeren ayrıştırılabilir bir nesne nasıl iletilir?


97

ParcelableAşağıda bir nesne oluşturdum , nesnem bir ListÜrün içeriyor . Kurucumda, Parcelablefor the List?

Parselde bulunan tüm yöntemleri kontrol ettim ve mevcut olan her şey readArrayList(ClassLoader). Bunun en iyi yaklaşım olup olmadığından emin değilim, tavsiyeniz gerçekten takdir edilecektir.

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

Ve neyin var readList()?
Alex Gitelman

Parcel türündeki readList (List, ClassLoader) yöntemi argümanlar için geçerli değildir ()
Byron

Tartışmalarda yanlış bir şey yok. Listeler genellikle bu şekilde kullanılır. Cevap ekledim.
Alex Gitelman

Yanıtlar:


104

Sınıf Product, paketlenebilir protokol ile uyumluysa, aşağıdaki belgelere göre çalışmalıdır.

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

Şart değil. Dokümantasyon writeList(), writeValue()metotla açıklanan özelliklere göre nesneleri yazacağını belirtir . developer.android.com/reference/android/os/… Diğer şeylerin yanı sıra, nesnenin Seri hale getirilebilir olabileceğini söylüyor. readList()muadilidir writeList()ve aynı verileri okuyacaktır.
Alex Gitelman

6
@AlexGitelman Ama serileştirmeyi kullanmak performans için kötü olarak değerlendiriliyor, bu yüzden Parcable'ı kullanıma sundular, bunu anlamsız kılan yapmaz mıydı?
eric.itzhak

30
Bu çözümü olduğu gibi kullanırken şansım olmadı. Null ClassLoader, in.readList(products,null);... gibi istisnaları alıyor. Benim için gerçekten işe in.readList(products,Product.class.getClassLoader());
Peter Dietz

2
Ayrıca Ürünün Serializable'ı uygulaması gerektiğini de unutmayın
agmezr

40

İlk olarak, Ürün nesneniz uygulanmalıdır Parcelable.

Ve sonra, kullanmak dest.writeTypedList(products)içinde writeToParcel()yöntemle.

Son olarak, listeyi ayrıştırmak için aşağıdaki kodu kullanın:

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

Daha fazla bilgi için lütfen Resmi Belgeye bakın :


6

Kişisel deneyimime göre, http://www.parcelabler.com/ bunun için harika bir site. Sadece sınıfınızı oluşturursunuz ve kopyalayıp web sitesine yapıştırırsınız ve sınıfınızın Parcelable bir sürümünü oluşturur.

Aşağıdaki değişkenleri içeren "Tema" adlı bir sınıfla test ettim:

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

WriteToParcel işlevi şu hale gelir:

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

oluşturulan yapıcı:

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

DÜZENLEME: Kart nesnesinin de Parcelable olduğundan emin olun!


5

Bu çalışmalı:

in.readTypedList(products, Product.CREATOR);

1
Benim için sorun yaratıyor, bu daha iyi çalışıyor: products = new ArrayList<Product>(); in.readList(products, Product.class.getClassLoader());
Shyam Sunder

1

uygulamak Parcelableyanı ve ardından Ürün sınıfına

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

Yukarıdaki çözümlerden herhangi biri işe yaramadıysa.


1

Diğer yol ise readValue & writeValue kullanmaktır .

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

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

Listenin öğeleri Parcelable uygulamalıdır


1

Hadi bakalım...

"Products.java" nın Parcelable ile genişletilmesi gerektiğinden emin olun

Aşama 1:

 private List<Products> products; 

Adım 2:

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

Aşama 3:

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

0

Varsayarsak Productuyguluyor Parcelable, sen yazma için kullanabilirsiniz:

dest.writeValue(products);

ve bunu okumak için:

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

0

Ürün Parcelable uygulanmalıdır

  Product class implements  Parcelable {
          ......
  }

Sonra size nesne içeren listeyi yazın

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

     }

 }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.