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

