किसी पार्सल योग्य वस्तु को कैसे पास करें जिसमें वस्तुओं की सूची हो?


96

मैंने 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 ???????;
    }
}

और इसमें गलत क्या है readList()?
एलेक्स गिटेलमैन

टाइप पार्सल में विधि रीडलिस्ट (सूची, क्लासऑलर) तर्क के लिए लागू नहीं है ()
बायरन

कुछ भी गलत नहीं है। इस प्रकार सूचियों का उपयोग अक्सर किया जाता है। मैंने जवाब जोड़ा।
एलेक्स गिटेलमैन

जवाबों:


103

यदि वर्ग Productपार्सलेबल प्रोटोकॉल के अनुकूल है, तो प्रलेखन के अनुसार काम करना चाहिए।

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

जरुरी नहीं। प्रलेखन में कहा गया है कि विधि writeList()द्वारा वर्णित विनिर्देशों के अनुसार ऑब्जेक्ट लिखेंगे writeValue()डेवलपर .android.com/reference/android/os/… अन्य बातों के अलावा, यह कहता है कि ऑब्जेक्ट सीरियल हो सकता है। readList()के समकक्ष है writeList()और उसी डेटा को पढ़ेगा।
एलेक्स गिटेलमैन

6
@AlexGitelman लेकिन क्रमांकन का उपयोग करना पूर्वाग्रह के लिए बुरा माना जाता है, इसीलिए उन्होंने Parcable को उपलब्ध कराया, ऐसा नहीं होगा जो इस बात को बेकार कर दे?
eric.itzhak

30
मेरे पास इस समाधान का उपयोग करने के लिए भाग्य नहीं था। अशक्त का ClassLoader in.readList(products,null);, जैसे अपवाद हो रहा है ... कारण: android.os.BadParcelableException: ClassNotFoundException जब अनमर्सलिंग: com.example.MyApplication.Product। मेरे लिए वास्तव में काम करने वाली सूची को पढ़ने की भिन्नता हैin.readList(products,Product.class.getClassLoader());
पीटर डिट्ज़

2
यह भी मत भूलो कि उत्पाद
सीरियल

40

सबसे पहले, आपकी उत्पाद वस्तु को लागू होना चाहिए Parcelable

और फिर, विधि dest.writeTypedList(products)में उपयोग करें writeToParcel()

अंत में, सूची को पार्स करने के लिए निम्नलिखित कोड का उपयोग करें:

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

अधिक जानकारी के लिए, कृपया आधिकारिक दस्तावेज़ देखें :


6

मेरे व्यक्तिगत अनुभव में, http://www.parcelabler.com/ इसके लिए एक अद्भुत साइट है। आप बस अपनी कक्षा बनाते हैं, और इसे वेबसाइट में पेस्ट करते हैं, और यह आपकी कक्षा का एक पार्सलेबल संस्करण उत्पन्न करता है।

मैंने इसे "थीम" नाम के एक वर्ग के साथ परीक्षण किया जिसमें निम्नलिखित चर थे:

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

राइटपॉर्सेल फ़ंक्शन बन जाता है:

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

संपादित करें: सुनिश्चित करें कि कार्ड ऑब्जेक्ट भी पार्सल है!


5

यह काम करना चाहिए:

in.readTypedList(products, Product.CREATOR);

1
यह मेरे लिए समस्याएं पैदा कर रहा है, यह बेहतर काम करता है: products = new ArrayList<Product>(); in.readList(products, Product.class.getClassLoader());
श्याम सुंदर

1

Parcelableउत्पाद वर्ग पर भी लागू करें

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

यदि उपरोक्त में से कोई भी समाधान काम नहीं करता है।


1

दूसरा तरीका यह है कि readValue और writeValue का उपयोग करें ।

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

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

सूची की वस्तुओं को पार्सलबल को लागू करना चाहिए


1

हेयर यू गो...

सुनिश्चित करें कि "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);
    }

0

यह मानते हुए Productलागू कर रहा है Parcelable, तो आप लेखन के लिए इसका उपयोग कर सकते हैं:

dest.writeValue(products);

और यह पढ़ने के लिए:

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

0

उत्पाद को पार्सल योग्य होना चाहिए

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

फिर आप लिखो ऑब्जेक्ट में सूची जैसी है

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

     }

 }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.