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

Android Kotlin:点击RecyclerView的CardView应用崩溃,求原因及解决方案

点击RecyclerView中CardView条目崩溃的原因及解决方法

崩溃核心原因

你在布局的Data Binding中给CardView设置了点击事件android:onClick="@{() -> clickListener.onClick(user)}",但在ViewHolder的bind方法里没有给binding.user赋值,导致点击时user为null,调用user.userId触发空指针异常(NullPointerException),直接引发应用崩溃。

修复步骤

1. 补全ViewHolder的bind方法

在MyViewHolder的bind方法中添加binding.user = user,确保Data Binding能拿到有效的user对象:

class MyViewHolder (val binding: ListItemBinding): RecyclerView.ViewHolder(binding.root) {
    fun bind(user: RegisterEntity, clickListener: RegisterEntityListener) {
        binding.user = user // 新增这行,给Data Binding的user变量赋值
        binding.clickListener = clickListener
        binding.FirstNameTextView.text = user.firstName
        binding.secondNameTextView.text = user.lastName
        binding.userTextField.text = user.userName
    }

    // ... 其他代码不变
}

2. (可选)利用Data Binding简化代码

你可以把布局中TextView的文本直接绑定到user对象的属性,减少手动设置文本的代码:
修改布局文件中的三个TextView:

<TextView
    android:id="@+id/First_name_text_View"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:text="@{user.firstName}"
    android:textColor="@color/cardview_light_background"
    android:textSize="30dp"
    android:textStyle="bold" />

<TextView
    android:id="@+id/second_name_text_View"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:text="@{user.lastName}"
    android:textColor="@color/cardview_light_background"
    android:textSize="30dp"
    android:textStyle="bold" />

<TextView
    android:id="@+id/user_TextField"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:text="@{user.userName}"
    android:textColor="@color/cardview_light_background"
    android:textSize="20dp"
    android:textStyle="bold" />

此时ViewHolder的bind方法可以简化为:

fun bind(user: RegisterEntity, clickListener: RegisterEntityListener) {
    binding.user = user
    binding.clickListener = clickListener
    binding.executePendingBindings() // 确保绑定立即生效
}

验证效果

修复后点击CardView,就能正常触发Toast显示对应的User ID,不会再崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:10:18