点击CardView获取数据并在另一Activity显示失败的技术求助
问题:点击RecyclerView的CardView跳转后详情数据未显示
我正在实现RecyclerView的Item点击功能,点击对应的CardView(对应代码里的holder.layout)时,想要把当前Item的详情数据传递到另一个Activity展示,但目前点击跳转后,目标Activity里并没有成功显示这些数据。我的Adapter相关代码片段如下:
public void onBindViewHolder(MenuItemViewHolder holder, int position) { final int _index = position; holder.iBookingRef.setText(itemList.get(position).getBookingID()); holder.iClientName.setText(itemList.get(position).getDelegeteName()); holder.iHotelName.setText(itemList.get(position).getHotelName()); holder.layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 这里的点击逻辑没写完,目前点击后数据无法传递到详情页 } }); }
解决方案:从数据传递到页面接收的完整排查步骤
1. 补全点击事件的数据传递逻辑
首先你的点击事件代码缺少核心的数据传递部分,需要在onClick里通过Intent把数据传给目标Activity,这里有两种常用的传递方式:
方式一:传递整个数据模型对象(推荐)
这种方式需要你的数据模型类(比如自定义的BookingModel)实现Serializable或Parcelable接口,让对象可以被序列化传递:
holder.layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取当前位置的完整数据对象 YourModelClass currentItem = itemList.get(_index); // 创建跳转Intent Intent detailIntent = new Intent(v.getContext(), YourDetailActivity.class); // 传递序列化后的对象 detailIntent.putExtra("SELECTED_BOOKING", currentItem); // 启动详情页 v.getContext().startActivity(detailIntent); } });
给模型类加Serializable接口非常简单,只需要一行代码:
public class YourModelClass implements Serializable { // 你的字段定义 private String bookingID; private String delegeteName; private String hotelName; // 构造方法、getter/setter方法... }
方式二:逐个传递字段(适合简单数据)
如果不想处理序列化,也可以把每个字段单独放进Intent:
holder.layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { YourModelClass currentItem = itemList.get(_index); Intent detailIntent = new Intent(v.getContext(), YourDetailActivity.class); detailIntent.putExtra("BOOKING_ID", currentItem.getBookingID()); detailIntent.putExtra("CLIENT_NAME", currentItem.getDelegeteName()); detailIntent.putExtra("HOTEL_NAME", currentItem.getHotelName()); v.getContext().startActivity(detailIntent); } });
2. 在详情Activity中正确接收并显示数据
不管用哪种传递方式,都要在目标Activity的onCreate方法里获取数据,然后赋值给对应的UI控件:
对应方式一(接收对象):
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); // 获取页面控件 TextView tvBookingRef = findViewById(R.id.tv_booking_ref); TextView tvClientName = findViewById(R.id.tv_client_name); TextView tvHotelName = findViewById(R.id.tv_hotel_name); // 接收传递过来的对象 YourModelClass selectedItem = (YourModelClass) getIntent().getSerializableExtra("SELECTED_BOOKING"); // 判空后赋值(避免空指针) if (selectedItem != null) { tvBookingRef.setText(selectedItem.getBookingID()); tvClientName.setText(selectedItem.getDelegeteName()); tvHotelName.setText(selectedItem.getHotelName()); } }
对应方式二(接收单个字段):
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); TextView tvBookingRef = findViewById(R.id.tv_booking_ref); TextView tvClientName = findViewById(R.id.tv_client_name); TextView tvHotelName = findViewById(R.id.tv_hotel_name); // 逐个接收字段 String bookingId = getIntent().getStringExtra("BOOKING_ID"); String clientName = getIntent().getStringExtra("CLIENT_NAME"); String hotelName = getIntent().getStringExtra("HOTEL_NAME"); // 赋值显示 tvBookingRef.setText(bookingId); tvClientName.setText(clientName); tvHotelName.setText(hotelName); }
3. 常见坑点排查
- 控件ID不匹配:确认详情页的TextView ID和
findViewById里的ID完全一致,大小写、拼写都不能错。 - 数据为空:可以在Adapter里加Log打印,确认
itemList.get(_index)的字段值不是null:Log.d("AdapterCheck", "Booking ID: " + currentItem.getBookingID()); - Intent的Key不一致:传递时用的
"SELECTED_BOOKING"和接收时的必须完全一样,Key是大小写敏感的。 - 模型类未序列化:如果传递对象但没实现Serializable/Parcelable,接收时会得到null,一定要记得加接口。
内容的提问来源于stack exchange,提问作者Dr.TZ
相关产品推荐
相关产品推荐

