在Intents之间发送自定义模型列表

时间:2015-09-08 04:44:52

标签: java android android-intent

我在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;
        }
    }
}


现在我希望将一个活动的主要数据列表发送到其他活动

5 个答案:

答案 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类型的数据,那么

  1. java.io.Serializable课程中实施MyModel界面。
  2. 使用Intent.putExtra(String name, Serializable value)方法发送带有Intent的模型列表。
  3. 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。
目前 ;我维护了一个全局列表(使用应用程序类的单例)并更新/检索它。