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

点击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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:32:52