You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:55:03