如何通过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
相关产品推荐
相关产品推荐

