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

如何通过Intent发送与接收对象类型ArrayList?Parcelable实现疑问

如何通过Intent发送自定义对象的ArrayList?

嘿,我来帮你搞定这个问题!要通过Intent传递自定义对象的ArrayList,核心是让你的Model类实现Parcelable接口——这是Android里高效传递对象的标准方式,比Serializable好用多了。下面一步步来:

1. 让你的Model类实现Parcelable

首先,你的Model类必须实现Parcelable接口,并重写必要的方法,还要创建一个CREATOR静态对象。举个例子,假设你的Model类包含字符串、布尔值字段:

import android.os.Parcel;
import android.os.Parcelable;

public class Model implements Parcelable {
    private String name;
    private boolean isActive;
    // 可以添加其他字段,比如int、double等

    // 普通构造函数,用于创建对象
    public Model(String name, boolean isActive) {
        this.name = name;
        this.isActive = isActive;
    }

    // 从Parcel中读取数据的构造函数,必须和writeToParcel的写入顺序一致
    protected Model(Parcel in) {
        name = in.readString();
        isActive = in.readByte() != 0; // boolean转byte存储,读取时转回来
    }

    // 必须实现的CREATOR,用于反序列化Parcel为Model对象
    public static final Creator<Model> CREATOR = new Creator<Model>() {
        @Override
        public Model createFromParcel(Parcel in) {
            return new Model(in);
        }

        @Override
        public Model[] newArray(int size) {
            return new Model[size];
        }
    };

    @Override
    public int describeContents() {
        return 0; // 几乎所有场景都返回0,除非涉及文件描述符
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeByte((byte) (isActive ? 1 : 0)); // 将boolean转为byte写入Parcel
    }

    // 可选:添加getter方法方便后续使用
    public String getName() { return name; }
    public boolean isActive() { return isActive; }
}

⚠️ 重点提醒:writeToParcel里的字段写入顺序,必须和Model(Parcel in)里的读取顺序完全一致,否则会出现数据错乱的问题!

2. 发送ArrayList

现在你的Model类已经符合要求了,就可以用Intent传递这个ArrayList了:

// 初始化你的ArrayList并添加数据
ArrayList<Model> m = new ArrayList<>();
m.add(new Model("张三", true));
m.add(new Model("李四", false));

// 创建Intent并传递数据
Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
intent.putParcelableArrayListExtra("DATA_KEY", m); // 无需强制转换,因为Model是Parcelable子类
startActivity(intent);

你之前写的强制转换(ArrayList<? extends Parcelable>) m其实可以省略,编译器会自动识别ArrayList<Model>属于ArrayList<? extends Parcelable>类型。

3. 接收ArrayList

在目标Activity的onCreate方法中,取出传递过来的ArrayList:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_target);

    // 获取Intent中的数据
    ArrayList<Model> receivedList = getIntent().getParcelableArrayListExtra("DATA_KEY");
    
    // 使用接收到的列表(记得判空避免空指针)
    if (receivedList != null) {
        for (Model item : receivedList) {
            Log.d("TAG", "名称: " + item.getName() + ", 是否激活: " + item.isActive());
        }
    }
}

额外注意事项

  • 如果Model类里包含其他自定义对象,那这些嵌套对象也必须实现Parcelable接口,否则无法正常传递。
  • 如果你不想用Parcelable,也可以让Model实现Serializable接口,用intent.putExtra("DATA_KEY", m)和getIntent().getSerializableExtra("DATA_KEY")传递,但Parcelable的效率远高于Serializable,数据量大时更推荐前者。
  • 发送和接收时要使用统一的key(比如示例中的DATA_KEY),否则会取不到数据。

内容的提问来源于stack exchange,提问作者amir dt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:22