Android中如何实现嵌套ArrayList<ArrayList<Statement>>的Parcelable传递
解决嵌套ArrayList<ArrayList>的Parcelable传递问题
这个问题我之前也碰到过,核心原因是putParcelableArrayListExtra只接受直接实现Parcelable接口的对象集合,而你的外层ArrayList<Statement>本身并没有实现Parcelable——哪怕里面的Statement已经做好了Parcelable实现也没用。下面给你两种靠谱的解决方法,推荐第一种,代码更清晰规范:
方法一:自定义Parcelable容器类(推荐)
我们可以把整个嵌套集合包装进一个自定义的Parcelable类里,让系统能识别并序列化它。
步骤1:创建容器类StatementNestedList
public class StatementNestedList implements Parcelable { private ArrayList<ArrayList<Statement>> nestedStatementList; // 构造方法,传入要传递的嵌套集合 public StatementNestedList(ArrayList<ArrayList<Statement>> nestedList) { this.nestedStatementList = nestedList; } // 从Parcel中读取数据的构造方法 protected StatementNestedList(Parcel in) { // 先读取外层集合的大小,再逐个读取内层的ArrayList<Statement> int outerListSize = in.readInt(); nestedStatementList = new ArrayList<>(outerListSize); for (int i = 0; i < outerListSize; i++) { // 利用createTypedArrayList读取Parcelable类型的集合 ArrayList<Statement> innerList = in.createTypedArrayList(Statement.CREATOR); nestedStatementList.add(innerList); } } // 必须实现的CREATOR public static final Creator<StatementNestedList> CREATOR = new Creator<StatementNestedList>() { @Override public StatementNestedList createFromParcel(Parcel in) { return new StatementNestedList(in); } @Override public StatementNestedList[] newArray(int size) { return new StatementNestedList[size]; } }; @Override public int describeContents() { // 没有特殊内容需要描述,返回0即可 return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // 先写入外层集合的大小,再逐个写入内层集合 dest.writeInt(nestedStatementList.size()); for (ArrayList<Statement> innerList : nestedStatementList) { // 用writeTypedList写入Parcelable类型的集合 dest.writeTypedList(innerList); } } // 提供获取嵌套集合的方法 public ArrayList<ArrayList<Statement>> getNestedStatementList() { return nestedStatementList; } }
步骤2:发送端传递数据
// 假设你的嵌套集合对象是statementNestedList Intent intent = new Intent(CurrentActivity.this, TargetActivity.class); StatementNestedList parcelableContainer = new StatementNestedList(statementNestedList); intent.putExtra("KEY_NESTED_STATEMENTS", parcelableContainer); startActivity(intent);
步骤3:接收端获取数据
Intent intent = getIntent(); // 注意这里用getParcelableExtra,不是getParcelableArrayListExtra StatementNestedList parcelableContainer = intent.getParcelableExtra("KEY_NESTED_STATEMENTS"); if (parcelableContainer != null) { ArrayList<ArrayList<Statement>> nestedList = parcelableContainer.getNestedStatementList(); // 这里就可以正常使用嵌套集合了 }
方法二:直接操作Parcel读写(不推荐,代码繁琐)
如果不想创建额外的容器类,也可以手动把嵌套集合拆分成Parcelable数组传递,但代码会更繁琐,可读性差:
发送端
Intent intent = new Intent(CurrentActivity.this, TargetActivity.class); Parcel parcel = Parcel.obtain(); // 写入外层集合大小 parcel.writeInt(statementNestedList.size()); for (ArrayList<Statement> innerList : statementNestedList) { parcel.writeTypedList(innerList); } parcel.setDataPosition(0); // 把Parcel转换成字节数组传递 intent.putExtra("KEY_NESTED_STATEMENTS", parcel.marshall()); parcel.recycle();
接收端
Intent intent = getIntent(); byte[] data = intent.getByteArrayExtra("KEY_NESTED_STATEMENTS"); Parcel parcel = Parcel.obtain(); parcel.unmarshall(data, 0, data.length); parcel.setDataPosition(0); int outerSize = parcel.readInt(); ArrayList<ArrayList<Statement>> nestedList = new ArrayList<>(outerSize); for (int i = 0; i < outerSize; i++) { ArrayList<Statement> innerList = parcel.createTypedArrayList(Statement.CREATOR); nestedList.add(innerList); } parcel.recycle();
关键注意事项
- 确保你的
Statement类的Parcelable实现完全正确:writeToParcel和createFromParcel的字段读写顺序必须严格一致,否则会出现数据错乱。 - 如果是Kotlin项目,也可以用
@Parcelize注解简化Parcelable的实现,容器类同样适用。
内容的提问来源于stack exchange,提问作者ebeninki
相关产品推荐
相关产品推荐

