Android 如何编写接口的ArrayList

Android 如何编写接口的ArrayList,android,interface,parcelable,Android,Interface,Parcelable,有一个接口DrawingElement(扩展Parcelable)具有多个实现。另一个类中有一个字段列出元素,它实现了可包裹。因此,应该将列表写入地块,但读取Parcelable ArrayList的方法需要一个具体的类来引用创建者的具体实现,而这不起作用:in.createTypedArrayList(DrawingElement.Creator) 公共接口DrawingElement扩展了Parcelable{ } 公共类FirstDrawingElementImpl实现DrawingEle

有一个接口
DrawingElement
(扩展
Parcelable
)具有多个实现。另一个类中有一个字段
列出元素
,它实现了
可包裹
。因此,应该将列表写入地块,但读取Parcelable ArrayList的方法需要一个具体的类来引用创建者的具体实现,而这不起作用:
in.createTypedArrayList(DrawingElement.Creator)

公共接口DrawingElement扩展了Parcelable{
}
公共类FirstDrawingElementImpl实现DrawingElement{
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
//容易做。
}
}
公共类SecondDrawingElementImpl实现DrawingElement{
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
//容易做。
}
}
公共类DrawingElementsContainer实现Parcelable{
私有列表元素;
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
//待办事项:
}
}
有什么建议吗

更新:

如果我不得不使用@pskink的建议,我必须做一些奇怪的演员,比如:

protected Drawing(Parcel in) {
    DrawingElement[] parcelables = (DrawingElement[]) in.readParcelableArray(DrawingElement.class.getClassLoader());
    elements = new ArrayList<>(Arrays.asList(parcelables));
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeParcelableArray(elements.toArray(new Parcelable[elements.size()]), flags);
}
受保护的图形(地块中){
.readParcelableArray(DrawingElement.class.getClassLoader())中的DrawingElement[]parcelables=(DrawingElement[]);
元素=新的ArrayList(Arrays.asList(parcelables));
}
公共无效写入包裹(包裹目的地,内部标志){
dest.writeParcelableArray(elements.toArray(新的包裹[elements.size()]),标志);
}

dest.writeList(elements)
显然是一个决定,但是我传递了一个接口类加载器,这让我感到困惑。

使用下面的代码来定义类<代码>地块。readArrayList方法用于从地块读取列表,而
地块。wrtieList
方法用于将列表写入地块

公共类DrawingElementsContainer实现可包裹{
私有数组列表元素;
公共绘图元素容器(包裹内){
elements=in.readArrayList(DrawingElement.class.getClassLoader());
}
公共ArrayList getElements(){
返回元素;
}
公共void集合元素(ArrayList元素){
这个元素=元素;
}
@凌驾
公共int描述内容(){
返回0;
}
公共绘图元素容器()
{
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的写入列表(元素);
}
公共静态最终包裹。创建者
=新的Parcelable.Creator(){
公共绘图元素Container createFromParcel(地块中){
返回新的绘图元素容器(in);
}
公共绘图元素容器[]新数组(整数大小){
返回新的DrawingElementsContainer[尺寸];
}
};
}

希望它能帮助您

了解您是如何实现它的。您需要什么
Parcelable
做什么?@ootinii,如果我知道如何实现将接口列表写入一个包,那就没有问题了。@pskink,我需要在onSaveInstanceState方法中使用它。接口是一个“代码”,您需要保存一些“状态”:这是您的数据,而不是代码。请解释接口类加载器如何解析实现类。这就是让我困惑的地方。您可以在这里使用类而不是接口(对于DrawingElement)来让它为您工作。你只需要使用界面吗?是的,我需要,这是问题的关键。有趣的是,您的代码实际上可以工作。有些魔法发生在背景中,我不完全理解。这不是魔法。这是执行的方式。它基于我们的实现工作
protected Drawing(Parcel in) {
    DrawingElement[] parcelables = (DrawingElement[]) in.readParcelableArray(DrawingElement.class.getClassLoader());
    elements = new ArrayList<>(Arrays.asList(parcelables));
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeParcelableArray(elements.toArray(new Parcelable[elements.size()]), flags);
}
public class DrawingElementsContainer implements Parcelable {

    private ArrayList<DrawingElement> elements;

    public DrawingElementsContainer(Parcel in) {
        elements=in.readArrayList(DrawingElement.class.getClassLoader());
    }

    public ArrayList<DrawingElement> getElements() {
        return elements;
    }

    public void setElements(ArrayList<DrawingElement> elements) {
        this.elements = elements;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public DrawingElementsContainer()
    {

    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(elements);
    }
    public static final Parcelable.Creator<DrawingElementsContainer> CREATOR
            = new Parcelable.Creator<DrawingElementsContainer>() {
        public DrawingElementsContainer createFromParcel(Parcel in) {
            return new DrawingElementsContainer(in);
        }

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