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

