我创建了一个模型实现了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,没关系。但是对象列表发生了这个问题。我花了一天时间来搜索和解决这个问题,但什么都没有。谁能告诉我我必须做什么?
答案 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。