intent.putExtra Parcelable 对象和枚举列表
intent.putExtra a list of Parcelable objects and enums
这个问题不同于所有其他问题,因为这里的可打包对象列表是在外部动态创建的,只是在通过 Intent 发送之前。
问题:产品是可包裹的,但定制 List<Product>
不是。如何制作 List
Parcelable
??
产品
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);
}
}
Activity class
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);
error: incompatible types: List<Department>
cannot be converted to
ArrayList<? extends Parcelable>
您不需要使 List 可打包。说白了,就是用现有的方法。
final Intent i = new Intent(this,SecondActivity.class);
final ArrayList<Product> list = new ArrayList< Product >();
i.putParcelableArrayListExtra(PRODUCT_KEY, list);
startActivity(i);
以几乎相同的方式检索。
final ArrayList<Product> list = this.getIntent()
.getParcelableArrayListExtra(PRODUCT_KEY);
更新
回答你最新的问题。您不能在内部传递泛型 List
。因为 List
你可以有不同的 collection。要知道系统使用哪种类型,您需要具有显式类型。
// This will work.
final ArrayList<Department> departments = getSpecificDepartments();
intent.putParcelableArrayListExtra(DEPARTMENTS_KEY, departments);
试试这个
var intent = Intent(this, ActivityB::class.java)
val list = arrayListOf<Person>()
intent.putParcelableArrayListExtra("LIST", list)
像这样使用putParcelableArrayListExtra
方法:
ArrayList<Product> products = getSpecificProducts();
intent.putParcelableArrayListExtra("PRODUCTS", products);
这个问题不同于所有其他问题,因为这里的可打包对象列表是在外部动态创建的,只是在通过 Intent 发送之前。
问题:产品是可包裹的,但定制 List<Product>
不是。如何制作 List
Parcelable
??
产品
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);
}
}
Activity class
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);
error: incompatible types:
List<Department>
cannot be converted toArrayList<? extends Parcelable>
您不需要使 List 可打包。说白了,就是用现有的方法。
final Intent i = new Intent(this,SecondActivity.class);
final ArrayList<Product> list = new ArrayList< Product >();
i.putParcelableArrayListExtra(PRODUCT_KEY, list);
startActivity(i);
以几乎相同的方式检索。
final ArrayList<Product> list = this.getIntent()
.getParcelableArrayListExtra(PRODUCT_KEY);
更新
回答你最新的问题。您不能在内部传递泛型 List
。因为 List
你可以有不同的 collection。要知道系统使用哪种类型,您需要具有显式类型。
// This will work.
final ArrayList<Department> departments = getSpecificDepartments();
intent.putParcelableArrayListExtra(DEPARTMENTS_KEY, departments);
试试这个
var intent = Intent(this, ActivityB::class.java)
val list = arrayListOf<Person>()
intent.putParcelableArrayListExtra("LIST", list)
像这样使用putParcelableArrayListExtra
方法:
ArrayList<Product> products = getSpecificProducts();
intent.putParcelableArrayListExtra("PRODUCTS", products);