多视图RecyclerView Adapter视图未加载,触发空指针异常求助
解决MultiView RecyclerView Adapter空指针问题
你的问题出在ViewHolder未提前初始化子视图引用,直接在onBindViewHolder中通过itemView访问视图ID,依赖的Kotlin Android扩展(已被弃用)可能存在绑定失效问题,或者视图查找逻辑不稳定,最终触发空指针。下面是两种可靠的修复方案:
方案一:使用View Binding(推荐)
View Binding是官方推荐的视图绑定方式,能彻底避免空指针问题,同时提升代码安全性。
1. 启用View Binding
在模块的build.gradle.kts(或build.gradle)中开启View Binding:
android { buildFeatures { viewBinding = true } }
2. 修改ViewHolder类
利用自动生成的Binding类初始化视图引用:
class TextFieldViewHolder(private val binding: QuesPatternInputfieldBinding) : RecyclerView.ViewHolder(binding.root) class RadioGroupViewHolder(private val binding: QuesPatternRadiobuttongroupBinding) : RecyclerView.ViewHolder(binding.root)
3. 更新onCreateViewHolder
通过Binding类加载布局并创建ViewHolder:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { Constants.PATTERN_TEXTFIELD -> { val binding = QuesPatternInputfieldBinding.inflate(LayoutInflater.from(parent.context), parent, false) TextFieldViewHolder(binding) } Constants.PATTERN_RADIOBUTTONGROUP -> { val binding = QuesPatternRadiobuttongroupBinding.inflate(LayoutInflater.from(parent.context), parent, false) RadioGroupViewHolder(binding) } else -> { val binding = QuesPatternInputfieldBinding.inflate(LayoutInflater.from(parent.context), parent, false) TextFieldViewHolder(binding) } } }
4. 修改onBindViewHolder
直接通过ViewHolder的Binding对象访问视图:
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { val model = list[position] when(holder) { is RadioGroupViewHolder -> { holder.binding.tvQuestion.text = model.question } is TextFieldViewHolder -> { holder.binding.tilInputField.hint = model.question } } }
方案二:手动初始化视图引用
如果暂时不想用View Binding,可以在ViewHolder构造函数中手动查找视图:
1. 修改ViewHolder类
class TextFieldViewHolder(view: View) : RecyclerView.ViewHolder(view) { val tilInputField: TextInputLayout = view.findViewById(R.id.tilInputField) } class RadioGroupViewHolder(view: View) : RecyclerView.ViewHolder(view) { val tvQuestion: TextView = view.findViewById(R.id.tvQuestion) }
2. 更新onBindViewHolder
直接使用ViewHolder的成员变量访问视图:
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { val model = list[position] when(holder) { is RadioGroupViewHolder -> { holder.tvQuestion.text = model.question } is TextFieldViewHolder -> { holder.tilInputField.hint = model.question } } }
额外检查点
- 确认
ques_pattern_inputfield.xml中TextInputLayout的ID确实是tilInputField,无拼写错误; - 验证
getItemViewType返回的viewType与数据模型中的类型完全匹配,确保布局加载与ViewHolder类型对应。
内容的提问来源于stack exchange,提问作者Mafaz Ahsan
相关产品推荐
相关产品推荐

