如何传递包含对象列表的可包裹对象?


96

我在Parcelable下面创建了一个对象,我的对象包含一个List产品。在我的构造函数中,如何处理Parcelablefor的重新创建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()
Alex Gitelman

包裹类型的方法readList(List,ClassLoader)不适用于参数()
Byron

论证没有错。这就是经常使用列表的方式。我添加了答案。
Alex Gitelman

Answers:


102

如果类Product与可包裹协议兼容,则应根据文档进行以下操作。

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

不必要。文档说明writeList()将根据writeValue()方法描述的规范写入对象。developer.android.com/reference/android/os/…除此之外,它还说该对象可以序列化。readList()是的对应项writeList(),并将读取相同的数据。
Alex Gitelman

6
@AlexGitelman但是使用序列化被认为对性能不好,所以这就是为什么他们使Parcable可用,难道doig使得这一点毫无意义吗?
eric.itzhak 2012年

30
我没有按原样使用此解决方案的运气。ClassLoader为null in.readList(products,null);,得到类似...的异常。阅读对我真正in.readList(products,Product.class.getClassLoader());
有用

2
同样不要忘记,产品需要实现可序列化
agmezr 2014年

40

首先,您的Product对象必须实现Parcelable

然后,使用dest.writeTypedList(products)in writeToParcel()方法。

最后,使用以下代码来解析列表:

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

欲了解更多信息,请参考官方文件


6

以我的个人经验,http://www.parcelabler.com/是一个很棒的网站。您只需创建您的课程,然后将其复制粘贴到网站中,即可生成该课程的Parcelable版本。

我使用名为“ Theme”的类进行了测试,该类包含以下变量:

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

writeToParcel函数变为:

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

编辑:确保Card对象也是可包裹的!


5

这应该工作:

in.readTypedList(products, Product.CREATOR);

1
它为我带来了问题,效果更好: products = new ArrayList<Product>(); in.readList(products, Product.class.getClassLoader());
Shyam Sunder

1

同样Parcelable在Product类上实现

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

如果上述任何解决方案均无效。


1

另一种方法是使用 readValuewriteValue

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

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

清单中的项目应实施Parcelable


1

干得好...

确保应使用Parcelable扩展“ Products.java”

第1步:

 private List<Products> products; 

第2步:

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

第三步:

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

     }

 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.