如何将数组对象传递至另一个Activity?技术求助
嘿,我来帮你搞定这个Intent传递对象的问题!
解决Android列表项点击传递对象到另一个Activity的问题
首先要明确:能通过Intent传递的对象必须实现Parcelable或Serializable接口——这是绝大多数人踩坑的核心点!推荐用Parcelable,它的运行效率比Serializable更高。
第一步:让你的数据类实现Parcelable
假设你的数据类是Item,我给你写个示例:
Kotlin版本
data class Item(val id: Int, val name: String, val desc: String) : Parcelable { constructor(parcel: Parcel) : this( parcel.readInt(), parcel.readString() ?: "", parcel.readString() ?: "" ) override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeInt(id) parcel.writeString(name) parcel.writeString(desc) } override fun describeContents(): Int { return 0 } companion object CREATOR : Parcelable.Creator<Item> { override fun createFromParcel(parcel: Parcel): Item { return Item(parcel) } override fun newArray(size: Int): Array<Item?> { return arrayOfNulls(size) } } }
Java版本
public class Item implements Parcelable { private int id; private String name; private String desc; public Item(int id, String name, String desc) { this.id = id; this.name = name; this.desc = desc; } protected Item(Parcel in) { id = in.readInt(); name = in.readString(); desc = in.readString(); } public static final Creator<Item> CREATOR = new Creator<Item>() { @Override public Item createFromParcel(Parcel in) { return new Item(in); } @Override public Item[] newArray(int size) { return new Item[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); dest.writeString(desc); } // 别忘了写getter方法 public int getId() { return id; } public String getName() { return name; } public String getDesc() { return desc; } }
第二步:在Adapter中正确配置Intent传递对象
在Adapter的列表项点击事件里,要确保拿到正确位置的对象,再把它放进Intent:
Kotlin Adapter示例
inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(item: Item) { // 先把数据绑定到View上... itemView.setOnClickListener { val intent = Intent(itemView.context, TargetActivity::class.java) // 用自定义的key把对象放进Intent intent.putExtra("EXTRA_SELECTED_ITEM", item) itemView.context.startActivity(intent) } } }
Java Adapter示例
public class ItemViewHolder extends RecyclerView.ViewHolder { public ItemViewHolder(View itemView) { super(itemView); itemView.setOnClickListener(v -> { int position = getAdapterPosition(); // 一定要判断位置是否有效,避免空指针 if (position != RecyclerView.NO_POSITION) { Item selectedItem = mItemList.get(position); Intent intent = new Intent(v.getContext(), TargetActivity.class); intent.putExtra("EXTRA_SELECTED_ITEM", selectedItem); v.getContext().startActivity(intent); } }); } public void bind(Item item) { // 绑定数据到View... } }
第三步:在目标Activity中接收对象
跳转到的目标Activity里,通过Intent取出传递的对象:
Kotlin TargetActivity示例
class TargetActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_target) val selectedItem = intent.getParcelableExtra<Item>("EXTRA_SELECTED_ITEM") selectedItem?.let { // 这里就可以用对象里的数据了,比如显示到TextView tv_item_name.text = it.name tv_item_desc.text = it.desc } } }
Java TargetActivity示例
public class TargetActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_target); Intent intent = getIntent(); if (intent != null) { Item selectedItem = intent.getParcelableExtra("EXTRA_SELECTED_ITEM"); if (selectedItem != null) { TextView tvName = findViewById(R.id.tv_item_name); TextView tvDesc = findViewById(R.id.tv_item_desc); tvName.setText(selectedItem.getName()); tvDesc.setText(selectedItem.getDesc()); } } } }
常见排查点
如果还是传不过去,检查这几个地方:
- 数据类是否完整实现了
Parcelable/Serializable,比如Parcelable的CREATOR和writeToParcel方法有没有漏写 - 传递和接收时用的key必须完全一致(比如上面的
EXTRA_SELECTED_ITEM) - Adapter中获取的点击位置对应的对象是不是null,有没有正确拿到列表数据
- 如果用的是
Serializable,接收时要改用getSerializableExtra()
要是还解决不了,把你的MainActivity和Adapter具体代码贴出来,我再帮你定位问题!
内容的提问来源于stack exchange,提问作者nyjxrb30
相关产品推荐
相关产品推荐

