【问题标题】:Android Parcelable - Write and read ArrayList< IA > when IA is a interfaceAndroid Parcelable - 当 IA 为接口时写入和读取 ArrayList<IA>
【发布时间】:2013-03-10 18:00:20
【问题描述】:

我有一个接口 IA 和实现它们的类 BC。 B 和 C 都实现了Parcelable

然后我有棘手的部分:

D 类有一个ArrayList&lt; IA &gt;。我也需要在arraylist 中插入 B 类和 C 类。它们共享相同的结构,但 “IS-A” 关系不适用。

我需要将 D 作为包裹从一项活动传递到另一项活动。

我试过写(ArrayList&lt;IA&gt;) in.readSerializable,但我得到了一个IOException。我知道如果 IA 不是一个接口,问题就很简单,但我似乎找不到一个简单的解决方案。

有什么想法吗?

@SuppressWarnings("unchecked")
public D (Parcel in) {
    list = new ArrayList<IA>();
    (...)    
    list = (ArrayList<IA>) in.readSerializable 
    }

@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR =
new Parcelable.Creator() {
    public D createFromParcel(Parcel in) {
        return new D(in);
    }

    public D[] newArray(int size) {
        return new D[size];
    }
};

public int describeContents() {
    return 0;
}

public void writeToParcel(Parcel dest, int flags) {
    (...)
    dest.writeList(list);
}

【问题讨论】:

  • IA 应该扩展 Parcelable
  • 和 D 使用 in.readArrayList(list, Creator)?但是哪个创造者?
  • 你能贴出任何 D 类 Parcelable 方法的代码来看看吗?
  • 我已经用解决方案编辑了问题(还没有足够的声誉)。
  • 同意您的解决方案,除了这允许实现不可序列化的 IA,因此在您 writeList 时崩溃。

标签: java android interface arraylist parcelable


【解决方案1】:

我建议您安装“Android Parcelable 代码生成器”插件。在此之后,您可以生成writeToParcel 函数、从包裹和创建者类读取的构造函数,只需单击Alt+Insert 按钮。

【讨论】:

    【解决方案2】:
        @SuppressWarnings("unchecked")
    public D (Parcel in) {
        list = new ArrayList<IA>();
        (...)    
        //ERROR -> list = (ArrayList<IA>) in.readSerializable 
        list = in.readArrayList(IA.class.getClassLoader());
    }
    
    @SuppressWarnings("rawtypes")
    public static final Parcelable.Creator CREATOR =
    new Parcelable.Creator() {
        public D createFromParcel(Parcel in) {
            return new D(in);
        }
    
        public D[] newArray(int size) {
            return new D[size];
        }
    };
    
    public int describeContents() {
        return 0;
    }
    
    public void writeToParcel(Parcel dest, int flags) {
        (...)
        dest.writeList(list);
    }
    

    【讨论】:

    • 我有一个问题,我认为您可以提供帮助。我有 ArrayList> 我想将其写入包裹,然后在下一个活动中读取它。你能指导一下怎么做吗?
    • 如何确保“未经检查”的警告不存在? (除了压制他们)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2017-02-22
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2014-06-26
    • 2014-01-27
    相关资源
    最近更新 更多