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

如何将RecyclerView条目数据通过Bundle与Intent传递至另一个Activity?

如何将RecyclerView条目数据通过Bundle+Intent传递到另一个Activity?

嘿,这事儿其实挺清晰的,我给你一步步拆解明白:

1. 先让你的数据模型实现Parcelable接口

要把对象放进Bundle传递,得让它支持序列化——Android里推荐用Parcelable(比Serializable高效很多)。这里给你写两种语言的示例:

Kotlin 版本(用@Parcelize注解简化代码)

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class ItemData(
    val id: Int,
    val title: String,
    val content: String
) : Parcelable

注意:如果用这个注解,记得在Module级的build.gradle里添加插件:id 'kotlin-parcelize',不然注解不生效哦

Java 版本(手动实现Parcelable)

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

public class ItemData implements Parcelable {
    private int id;
    private String title;
    private String content;

    // 常规构造函数
    public ItemData(int id, String title, String content) {
        this.id = id;
        this.title = title;
        this.content = content;
    }

    // 从Parcel中读取数据的构造函数
    protected ItemData(Parcel in) {
        id = in.readInt();
        title = in.readString();
        content = in.readString();
    }

    // 必须实现的CREATOR
    public static final Creator<ItemData> CREATOR = new Creator<ItemData>() {
        @Override
        public ItemData createFromParcel(Parcel in) {
            return new ItemData(in);
        }

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

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(title);
        dest.writeString(content);
    }

    // 别忘了写getter方法
    public int getId() { return id; }
    public String getTitle() { return title; }
    public String getContent() { return content; }
}

2. 在RecyclerView Adapter中处理条目点击,传递数据

在Adapter的onBindViewHolder方法里,给条目视图设置点击监听,点击时把数据打包进Bundle(或者直接放进Intent),然后启动目标Activity:

Kotlin Adapter示例

class MyAdapter(private val itemList: List<ItemData>, private val context: Context) :
    RecyclerView.Adapter<MyAdapter.ViewHolder>() {

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val tvTitle: TextView = itemView.findViewById(R.id.tv_title)
        val tvContent: TextView = itemView.findViewById(R.id.tv_content)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.your_item_layout, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val currentItem = itemList[position]
        holder.tvTitle.text = currentItem.title
        holder.tvContent.text = currentItem.content

        // 设置条目点击事件
        holder.itemView.setOnClickListener {
            val intent = Intent(context, TargetActivity::class.java)
            // 方式1:直接把Parcelable对象放进Intent
            intent.putExtra("ITEM_DATA", currentItem)
            // 方式2:先放进Bundle再传入Intent(两种方式都可行)
            /*val bundle = Bundle()
            bundle.putParcelable("ITEM_DATA", currentItem)
            intent.putExtras(bundle)*/
            context.startActivity(intent)
        }
    }

    override fun getItemCount(): Int {
        return itemList.size
    }
}

Java Adapter示例

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<ItemData> itemList;
    private Context context;

    public MyAdapter(List<ItemData> itemList, Context context) {
        this.itemList = itemList;
        this.context = context;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView tvTitle;
        TextView tvContent;

        public ViewHolder(View itemView) {
            super(itemView);
            tvTitle = itemView.findViewById(R.id.tv_title);
            tvContent = itemView.findViewById(R.id.tv_content);
        }
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.your_item_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        ItemData currentItem = itemList.get(position);
        holder.tvTitle.setText(currentItem.getTitle());
        holder.tvContent.setText(currentItem.getContent());

        // 条目点击事件
        holder.itemView.setOnClickListener(v -> {
            Intent intent = new Intent(context, TargetActivity.class);
            // 直接传递Parcelable对象
            intent.putExtra("ITEM_DATA", currentItem);
            context.startActivity(intent);
        });
    }

    @Override
    public int getItemCount() {
        return itemList.size();
    }
}

3. 在目标Activity中接收数据

在目标Activity的onCreate方法里,从Intent中取出传递过来的数据即可:

Kotlin 目标Activity示例

class TargetActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_target)

        // 获取传递过来的数据
        val itemData = intent.getParcelableExtra<ItemData>("ITEM_DATA")
        // 如果是用Bundle传递的话,这么取:
        // val bundle = intent.extras
        // val itemData = bundle?.getParcelable<ItemData>("ITEM_DATA")

        // 拿到数据后就可以使用了,比如显示到TextView
        itemData?.let {
            findViewById<TextView>(R.id.tv_target_title).text = it.title
            findViewById<TextView>(R.id.tv_target_content).text = it.content
        }
    }
}

Java 目标Activity示例

public class TargetActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_target);

        // 获取传递过来的数据
        ItemData itemData = getIntent().getParcelableExtra("ITEM_DATA");

        // 使用数据
        if (itemData != null) {
            TextView tvTitle = findViewById(R.id.tv_target_title);
            TextView tvContent = findViewById(R.id.tv_target_content);
            tvTitle.setText(itemData.getTitle());
            tvContent.setText(itemData.getContent());
        }
    }
}

额外小提醒

  • 如果需要传递列表数据,可以用putParcelableArrayListExtra或者putParcelableArrayExtra,用法和单个对象类似。
  • 确保数据模型里的所有字段都正确实现了Parcelable的读写逻辑,避免数据丢失(比如嵌套的对象也要实现Parcelable)。

内容的提问来源于stack exchange,提问作者Rohan Pudipeddi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:59:13