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