无法在Parcel中写入List <object>

时间:2015-12-16 10:15:48

标签: java android

我创建了一个模型实现了Parcelable。

public class ParcelableTreeNode implements Parcelable {
private TreeNode treeNode;
public ParcelableTreeNode(TreeNode treeNode){
    this.treeNode=treeNode;
}

public TreeNode getTreeNode(){
    return treeNode;
}

public int describeContents(){
    return 0;
}

public void writeToParcel(Parcel out, int flag){

    out.writeList(treeNode.getmAncester());
    out.writeString(treeNode.getContent());
    out.writeInt(treeNode.getId());
    out.writeInt(treeNode.getLevel());
    out.writeString(treeNode.getParentId());
    out.writeList(treeNode.getChildren());

}

public static final Parcelable.Creator<ParcelableTreeNode> CREATOR
        = new Parcelable.Creator<ParcelableTreeNode>(){
    public ParcelableTreeNode createFromParcel(Parcel in){
        return new ParcelableTreeNode(in);
    }

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

private ParcelableTreeNode(Parcel in){
    List ancestor= new ArrayList<String>();
    List<TreeNode> children= new ArrayList<TreeNode>();

    in.readList(ancestor,null);
    String content= in.readString();
    int id=in.readInt();
    int level=in.readInt();
    String parentId=in.readString();
    in.readList(children,null);

    treeNode= new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_drive_file,content));

    treeNode.setmAncester(ancestor);
    treeNode.setContent(content);
    treeNode.setChildren(children);
    treeNode.setId(id);
    treeNode.setParentId(parentId);

}

}

我想将列表对象TreeNode传递给另一个Activity(Fragment)。但是在将对象TreeNode的列表子项写入Parcel时遇到问题:

out.writeList(treeNode.getChildren());

Logcat show:java.lang.RuntimeException:Parcel:无法编组值

将String列表写入Parcel,没关系。但是对象列表发生了这个问题。我花了一天时间来搜索和解决这个问题,但什么都没有。谁能告诉我我必须做什么?

2 个答案:

答案 0 :(得分:1)

如果您在“parcelable class”中有一个List,那么列表中的元素也必须是parcelables。

在ParcelableTreeNode(Parcel in)方法中,您有

(...) List<TreeNode> children= new ArrayList<TreeNode>();
(...) in.readList(children,null);

但是TreeNode不是可以分配的,这就是问题所在。

我不知道你为什么使用TreeNode和ParcelableTreeNode类而不是ParcelableTreeNode类,但如果你将TreeNode类的属性放入ParcelableTreeNode类,它应该可以工作。

答案 1 :(得分:0)

我几天前遇到过类似的问题。

您可以使用out.writeValue(treeNode.getChildren())并在您的构造函数中使用yourList = (List<?>) in.readValue(List.class.getClassLoader())

您必须为treeNode.getChildren()的适当返回类型交换List。