【问题标题】:How to writeToParcel an ArrayList of interface如何 writeToParcel 接口的 ArrayList
【发布时间】:2017-06-13 07:15:03
【问题描述】:

有一个接口DrawingElement(扩展Parcelable)有多种实现。在另一个类中有一个字段List<DrawingElement> elements,它实现了Parcelable。所以 List 应该被写入 Parcel,但是读取 Parcelable ArrayList 的方法需要一个具体的类来引用 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) 是显而易见的决定,但我因为传递了一个接口类加载器而感到困惑。

【问题讨论】:

  • 有助于了解您是如何实施的
  • 你需要Parcelable 做什么?
  • @ootinii,如果我知道如何实现将接口列表写入 Parcel,那就毫无疑问了。
  • @pskink,我在 onSaveInstanceState 方法中需要它。
  • 接口是一个“代码”,你需要保存一些“状态”:这是你的数据,不是代码

标签: android interface parcelable


【解决方案1】:

使用下面的代码来定义你的类。 parcel.readArrayList 方法用于从包裹中读取列表,parcel.wrtieList 方法用于将列表写入包裹。 Refer this answer.

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

希望对你有帮助

【讨论】:

  • 您能否解释一下接口类加载器如何解析实现类。这让我很困惑。
  • 您可以在此处使用类而不是接口(用于 DrawingElement)以使其适合您。有必要只用界面吗?
  • 是的,我愿意,这就是问题的重点。有趣的部分是您的代码确实有效。在后台发生了一些我不完全理解的魔法。
  • 这不是魔法。这是实现的方式。它基于我们的实现工作
猜你喜欢
  • 2018-04-14
  • 1970-01-01
  • 2021-09-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多