【发布时间】:2019-10-25 16:21:12
【问题描述】:
这个问题与所有其他问题不同,因为这里的可打包对象列表是在外部动态创建的,只是在之前通过 Intent 发送它。
问题:产品是可包裹的,但自定义 List<Product> 不是。如何制作ListParcelable??
产品
public class Product implements Parcelable {
public String id;
public String name;
public Product(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public int describeContents() {
return 0;
}
protected Product(Parcel in) {
id = in.readString();
name = in.readString();
}
public static final Creator<Product> CREATOR = new Creator<Product>() {
@Override
public Product createFromParcel(Parcel in) {
return new Product(in);
}
@Override
public Product[] newArray(int size) {
return new Product[size];
}
};
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(id);
parcel.writeString(name);
}
}
活动类
Intent intent = new Intent(this, ShowProducts.class);
List<Product> products = getSpecificProducts();
intent.putExtra("PRODUCTS", products); // error
startActivity(intent);
编辑
问题是两个,不是重复的,另一部分是List<Enum>
public enum Department implements Parcelable {
SALES("Sales", 0),
HR("HR", 1),
public String name;
public int ordinal;
Department(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
public static final Creator<Department> CREATOR = new Creator<Department>() {
@Override
public Department createFromParcel(Parcel in) {
return Department.values()[in.readInt()];
}
@Override
public Department[] newArray(int size) {
return new Department[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(ordinal);
}
}
根据建议的答案,我已经尝试过了。
List<Department> departments = getSpecificDepartments();
intent.putParcelableArrayListExtra("Departments", departments);
错误:不兼容的类型:
List<Department>无法转换为ArrayList<? extends Parcelable>
【问题讨论】:
-
使用 Pojo,您可以尝试将其编码为 JSON,稍后通过 Google 的 Gson 进行解析。
-
@AdmiralKunkka 你确定吗?
-
@GensaGames 您的回答非常正确。我只是提供另一种选择来解决他的问题。是的,任何包含这些对象的普通 java 对象或列表都可以通过 Gson 序列化为 JSON。
-
@AdmiralKunkka 你确定吗?双重序列化为 JSON、Parcelable 然后双重反序列化的另一种选择?
标签: android parcelable