কীভাবে পার্সেবল অবজেক্টে পাস করতে হবে যা অবজেক্টের একটি তালিকা রয়েছে?


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()বিকাশকারী.অ্যান্ড্রয়েড .com/references/android/os/… অন্যান্য জিনিসের মধ্যে এটি বলে যে অবজেক্টটি সিরিয়ালাইজযোগ্য হতে পারে। readList()এটি সমমনা writeList()এবং একই তথ্য পড়বে।
অ্যালেক্স গিটেলম্যান

6
@ অ্যালেক্সজিটেলম্যান কিন্তু সিরিয়ালাইজেশন ব্যবহারকে কার্য সম্পাদনের জন্য খারাপ বলে মনে করা হয়, তাই তারা পার্কেবলকে উপলব্ধ করে দিয়েছে, ডগ কি এই অর্থহীন করে না?
এরিক.টিজাক

30
এই সমাধানটি যেমন রয়েছে তেমন ব্যবহার করে আমার ভাগ্য হয় নি। নালার ক্লাসলোডার, এর in.readList(products,null);মত ব্যতিক্রম পেয়ে ... এর কারণ: অ্যান্ড্রয়েড.ওস.বেডপ্রেসেসেবলএক্সেপশন: আনমারশেলিংয়ের সময় ClassNotFoundException: com.example.Myapplication.Product। প্রকৃতপক্ষে আমার জন্য কাজ করে এমন তালিকাটি পড়ার প্রকরণটি হ'লin.readList(products,Product.class.getClassLoader());
পিটার ডায়েজ

4
এছাড়াও ভুলে যাবেন না যে পণ্যটির সিরিয়ালাইজেবল
অগ্মিজার

40

প্রথমত, আপনার পণ্য অবজেক্ট অবশ্যই প্রয়োগ করতে হবে Parcelable

এবং তারপর, ব্যবহার dest.writeTypedList(products)মধ্যে writeToParcel()পদ্ধতি।

পরিশেষে, তালিকাটি বিশ্লেষণের জন্য নিম্নলিখিত কোডটি ব্যবহার করুন:

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

আরও তথ্যের জন্য দয়া করে অফিসিয়াল ডকুমেন্টটি উল্লেখ করুন :


6

আমার ব্যক্তিগত অভিজ্ঞতায়, http://www.parcelabler.com/ এটির জন্য একটি আশ্চর্যজনক সাইট। আপনি কেবলমাত্র আপনার ক্লাস তৈরি করেছেন, এবং এটি অনুলিপি করুন ওয়েবসাইটে into

আমি এটি "থিম" নামে একটি শ্রেণীর সাথে পরীক্ষা করেছি যাতে নিম্নলিখিত ভেরিয়েবলগুলি রয়েছে:

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

WritToParcel ফাংশনটি হয়ে যায়:

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

সম্পাদনা: নিশ্চিত করুন যে কার্ড অবজেক্টটিও পার্সেবল!



1

Parcelableপ্রোডাক্ট ক্লাসেও প্রয়োগ করুন এবং তারপরেও

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

যদি উপরের সমাধানগুলির কোনও কাজ না করে।


1

অন্য উপায়টি হ'ল রিডভ্যালু এবং রাইটভ্যালু ব্যবহার করা ।

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

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

তালিকার আইটেমগুলি পার্সেবল কার্যকর করা উচিত


1

আপনি এখানে যান ...

নিশ্চিত করুন যে "Products.java" পার্সেবলের সাথে বাড়ানো উচিত

ধাপ 1:

 private List<Products> products; 

ধাপ ২:

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

     }

 }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.