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 ???????;
}
}
답변
클래스 Product
가 Parcelable 프로토콜과 호환되는 경우 문서에 따라 다음과 같이 작동해야합니다.
products = new ArrayList<Product>();
in.readList(products, Product.class.getClassLoader());
답변
먼저 Product 객체는 Parcelable
.
그리고, 사용 dest.writeTypedList(products)
의 writeToParcel()
방법.
마지막으로 다음 코드를 사용하여 목록을 구문 분석합니다.
products = new ArrayList<Product>();
in.readTypedList(products, Product.CREATOR);
자세한 내용은 공식 문서 를 참조하십시오 .
답변
개인적으로 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;
}
}
편집 : 카드 개체도 Parcelable인지 확인하십시오!
답변
이것은 작동합니다.
in.readTypedList(products, Product.CREATOR);
답변
구현 Parcelable
뿐만 아니라 다음 제품의 클래스
in.readList(this.list, Product.class.getClassLoader());
위의 솔루션 중 하나라도 작동하지 않는 경우.
답변
다른 방법은 readValue & writeValue 를 사용하는 것 입니다.
protected Product (Parcel in) {
...
in.readValue(this.getClass().getClassLoader());
}
@Override
public void writeToParcel(Parcel parcel, int i) {
...
parcel.writeValue(**list**);
}
목록의 항목은 Parcelable을 구현해야합니다.
답변
여기 있습니다 …
“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);
}