如何在Intent中传递实现Parcelable接口的Model对象?
实现点击ListView项传递单个Parcelable Model对象
嘿,这事儿其实挺 straightforward 的,我来给你一步步拆解怎么做:
先确认你的Model类Parcelable实现没毛病
虽然你说已经定义好了,但还是贴个标准的实现示例给你核对下,避免因为Parcelable写得有问题导致传参失败:
public class Model implements Parcelable { private String name; private int age; // 普通构造方法 public Model(String name, int age) { this.name = name; this.age = age; } // Parcelable专属构造,用来从Parcel里读数据 protected Model(Parcel in) { name = in.readString(); age = in.readInt(); } // 必须的CREATOR常量,系统用它来创建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]; } }; // 这个方法一般返回0就行,除非你有特殊的文件描述符要处理 @Override public int describeContents() { return 0; } // 把Model的数据写到Parcel里,传递的时候用 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } // 按需加Getter方法,方便后续取数据 public String getName() { return name; } public int getAge() { return age; } }
在MainActivity里处理ListView的点击事件
给你的ListView设置OnItemClickListener,点击时拿到对应位置的Model,塞进Intent里跳转:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 直接从集合里拿点击位置的Model实例 Model selectedModel = modelList.get(position); // 创建跳转的Intent,这里假设你要跳到DetailActivity Intent intent = new Intent(MainActivity.this, DetailActivity.class); // 用putExtra传递Parcelable对象,第一个参数是自定义的key,记得和接收端保持一致 intent.putExtra("SELECTED_MODEL", selectedModel); // 启动目标Activity startActivity(intent); } });
在目标Activity里接收传递过来的Model
比如在DetailActivity的onCreate方法里,把Intent里的Model取出来用:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); // 先判断Intent不为空,避免空指针 if (getIntent() != null) { // 用getParcelableExtra取出对象,key要和传递时的一致 Model receivedModel = getIntent().getParcelableExtra("SELECTED_MODEL"); // 拿到对象后就可以展示数据啦 if (receivedModel != null) { TextView tvName = findViewById(R.id.tv_name); TextView tvAge = findViewById(R.id.tv_age); tvName.setText(receivedModel.getName()); tvAge.setText(String.valueOf(receivedModel.getAge())); } } }
几个小提醒
- 传递和接收时用的key(比如上面的
SELECTED_MODEL)一定要完全一致,不然会取不到数据哦。 - 如果你的Model里有嵌套的复杂对象(比如其他Parcelable、List
),一定要确保这些对象也正确实现了Parcelable,并且在 writeToParcel和构造方法里正确读写数据。
内容的提问来源于stack exchange,提问作者Den
相关产品推荐
相关产品推荐

