Android Parcelable - 当 IA 是一个接口时,如何写入和读取 ArrayList<IA>

23

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

然后就有了难题:

D有一个ArrayList<IA>。我需要将B和C这两个类都插入到arraylist中。它们具有相同的结构,但"IS-A"关系不适用。

我需要将D作为Parcel从一个活动传递到另一个活动中。

我尝试编写(ArrayList<IA>) 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。 - njzk2
使用 in.readArrayList(list, Creator) 中的 D,但是哪个 creator? - Pedro Bernardo
你能发一下包含D类的Parcelable方法的代码让我看看吗? - Brosa
我已经编辑了问题并提供了解决方案(因为我还没有足够的声望)。 - Pedro Bernardo
我明白你的意思。但在IA上扩展Parcelable并不能解决问题。有什么建议吗? - Pedro Bernardo
显示剩余2条评论
2个回答

43
    @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<HashMap<String, Boolean>>,我想将其写入包裹中,然后在下一个活动中读取它。你能指导一下如何做吗? - Gem
请查看此链接:http://stackoverflow.com/questions/13228714/set-arraylist-hashmap-string-object-value - Pedro Bernardo
2
如何确保“unchecked”警告不会出现?(除了抑制它们) - Terry

1
我建议您安装“Android Parcelable代码生成器”插件。这样,您就可以通过点击“Alt+Insert”按钮生成writeToParcel函数、从包中读取的构造函数和创作类。请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接