我在SO上找到了很多答案,但没有一个对我有用。
我有一个List<MyModel> myList
我希望通过Intents传递和检索。
MyModel实现了Parcelable及其实现。
我正在使用intent.putExtra("my_key",(Parcelable) myList);
在运行时它会抛出例外
java.util.ArrayList无法强制转换为android.os.Parcelable
如果我使用putParcelableArrayListExtra
,那么它会说错误的第二个参数类型。
任何解释或其他方式都会有帮助。编辑:我的模型类是:
public class Filter {
private String categoryId;
public List<PrimaryFilterData> getPrimaryFilterDataList() {
return primaryFilterDataList;
}
public void setPrimaryFilterDataList(List<PrimaryFilterData> primaryFilterDataList) {
this.primaryFilterDataList = primaryFilterDataList;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public String getCategoryId() {
return categoryId;
}
public void setCategoryId(String categoryId) {
this.categoryId = categoryId;
}
private String categoryName;
private List<PrimaryFilterData> primaryFilterDataList;
public static class PrimaryFilterData implements Parcelable
{
private String filterId;
protected PrimaryFilterData(Parcel in) {
filterId = in.readString();
filterName = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(filterId);
dest.writeString(filterName);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<PrimaryFilterData> CREATOR = new Creator<PrimaryFilterData>() {
@Override
public PrimaryFilterData createFromParcel(Parcel in) {
return new PrimaryFilterData(in);
}
@Override
public PrimaryFilterData[] newArray(int size) {
return new PrimaryFilterData[size];
}
};
public String getFilterName() {
return filterName;
}
public void setFilterName(String filterName) {
this.filterName = filterName;
}
public String getFilterId() {
return filterId;
}
public void setFilterId(String filterId) {
this.filterId = filterId;
}
public List<SecondaryFilterData> getSecondaryFilterDataList() {
return secondaryFilterDataList;
}
public void setSecondaryFilterDataList(List<SecondaryFilterData> secondaryFilterDataList) {
this.secondaryFilterDataList = secondaryFilterDataList;
}
private String filterName;
private List<SecondaryFilterData> secondaryFilterDataList;
}
public static class SecondaryFilterData implements Parcelable {
private String secFilterName;
private String secFilterId;
private boolean isChecked=false;
public SecondaryFilterData(){}
protected SecondaryFilterData(Parcel in) {
secFilterName = in.readString();
secFilterId = in.readString();
isChecked = in.readByte() != 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(secFilterName);
dest.writeString(secFilterId);
dest.writeByte((byte) (isChecked ? 1 : 0));
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<SecondaryFilterData> CREATOR = new Creator<SecondaryFilterData>() {
@Override
public SecondaryFilterData createFromParcel(Parcel in) {
return new SecondaryFilterData(in);
}
@Override
public SecondaryFilterData[] newArray(int size) {
return new SecondaryFilterData[size];
}
};
public boolean isChecked() {
return isChecked;
}
public void setIsChecked(boolean isChecked) {
this.isChecked = isChecked;
}
public String getSecFilterName() {
return secFilterName;
}
public void setSecFilterName(String secFilterName) {
this.secFilterName = secFilterName;
}
public String getSecFilterId() {
return secFilterId;
}
public void setSecFilterId(String secFilterId) {
this.secFilterId = secFilterId;
}
}
}
现在我希望将一个活动的主要数据列表发送到其他活动
答案 0 :(得分:1)
您可以使用Bundle
来实现此目的。
// Important - use array list not regular list.
// MyModel must implement Parcelable
ArrayList<MyModel> myList;
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("my_key", myList);
intent.putExtras(bundle);
如果您的列表必须是List
类型,则可以在最后一刻进行转换。
bundle.putParcelableArrayList("my_key", new ArrayList<MyModel>(myList));
然后在接收活动中。
List<MyModel> myList = getIntent().getParcelableArrayListExtra("my_key");
答案 1 :(得分:1)
如果您的MyModel
类包含仅主要或String
类型的数据,那么
java.io.Serializable
课程中实施MyModel
界面。Intent.putExtra(String name, Serializable value)
方法发送带有Intent的模型列表。Intent.getSerializableExtra(String name)
返回列表; 答案 2 :(得分:0)
我认为问题是你的List确实没有实现Parcelable。它的内容确实如此尝试传递Parcelables的数组,而不是List:
intent.putExtra("my_key", myList.toArray());
编辑:我刚看到它也可以发送列表,但它们必须是ArrayList类型。如果您不想将List转换为数组,请尝试将列表声明为ArrayList<MyModel> myList
,其中MyModel必须实现Parcelable。
答案 3 :(得分:0)
您可以将java对象作为Parcelable对象传递给bundle。但在此之前,您需要模型java类来实现Parcelable接口并覆盖必要的方法。
一旦实现了Parcelable接口,就可以轻松地将模型类(java类)对象作为Parcelable传递给bundle。下面的小片段:
yourBundle.putParcelable(YOUR_OBJ_KEY,yourModelObject);
这里,yourModelObject是模型类的对象,它包含您可以使用的所有getter和setter方法。
我想说的是你将整个java对象传递给下一个活动而不是列表。通过这样做,您将获得在此java对象中的下一个活动中所需的所有信息。
答案 4 :(得分:0)
唷!
经过长时间的工作;我来谈谈结论(如果我找到更好的理由,我会更新答案)
Parceble / Serializablwe传递列表值作为参考;这就是我试图从其他活动中访问该列表的原因;它返回null。
目前 ;我维护了一个全局列表(使用应用程序类的单例)并更新/检索它。