如何写ToParcel接口的ArrayList

How to writeToParcel an ArrayList of interface

有一个接口 DrawingElement(扩展 Parcelable)有多个实现。另一个class中有一个字段List<DrawingElement> elements,它实现了Parcelable。所以List应该写入Parcel,但是读取Parcelable ArrayList的方法需要一个具体的class来引用Creator的具体实现,这是行不通的:in.createTypedArrayList(DrawingElement.CREATOR)

public interface DrawingElement extends Parcelable {
}

public class FirstDrawingElementImpl implements DrawingElement {
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // done easily.
    }
}

public class SecondDrawingElementImpl implements DrawingElement {
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // done easily.
    }
}

public class DrawingElementsContainer implements Parcelable {
    private List<DrawingElement> elements;

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // TODO:
    }
}

有什么建议吗?

更新:

如果我必须使用@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);
}

dest.writeList(elements) 是显而易见的决定,但我通过传递接口 classloader.

感到困惑

使用下面的代码定义您的class。 parcel.readArrayList 方法用于从包裹中读取列表,parcel.wrtieList 方法用于将列表写入包裹。 .

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];
        }
    };
}

希望对您有所帮助