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

如何将数组对象传递至另一个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:18:06