Android Kotlin开发RecyclerView报错dog_image为空及提问优化咨询
报错原因与修复方案
根本原因
你在onCreateViewHolder方法中加载的布局文件与实际存储控件的布局文件不匹配:
- 代码中加载的是
R.layout.activity_grid_list、R.layout.activity_vertical_list、R.layout.activity_horizontal_list这类Activity级别的页面布局 - 但你确认包含
dog_image等控件的是grid_list_item、vertical_horizontal_list_item这类RecyclerView列表项布局 - 你加载的Activity布局中不存在
dog_image对应的控件,findViewById返回null,结合Kotlin的非空断言!!就触发了本次崩溃。
另外代码存在冗余问题:你默认先inflate了一次activity_grid_list,后续根据layout值再替换为其他布局,属于不必要的重复渲染,会浪费性能。
修复代码
修改onCreateViewHolder逻辑,直接加载对应列表项布局即可:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DogCardViewHolder { // 提前映射布局类型与对应的列表项布局资源 val itemLayoutRes = when(layout){ // 网格布局对应网格item布局,此处数值根据你自己的布局类型规则调整即可 3 -> R.layout.grid_list_item // 垂直、水平列表共用同一款item布局 1,2 -> R.layout.vertical_horizontal_list_item // 兜底布局,避免非法参数崩溃 else -> R.layout.vertical_horizontal_list_item } val adapterLayout = LayoutInflater.from(parent.context) .inflate(itemLayoutRes, parent, false) return DogCardViewHolder(adapterLayout) }
建议后续把layout参数的类型从Int改为枚举类型,避免魔法值匹配错误。
技术提问优化建议
要更快获得准确解答,提问时可以补充以下信息:
- 明确触发报错的操作路径:比如是打开页面就崩溃,还是切换布局类型时崩溃
- 附上布局文件源代码而非截图:截图无法复制校验id拼写,也看不到完整布局结构
- 补充参数传递逻辑:比如你传入Adapter的
layout参数的取值范围、每个值对应的含义 - 说明已完成的排查操作:比如你已经确认item布局中存在对应id,避免答主重复提醒基础排查点
- 标注项目背景:你当前做的是Google Android Basics的Doggler教程项目,标注后有相关经验的答主能更快定位问题。
内容的提问来源于stack exchange,提问作者Andres Rosales
相关产品推荐
相关产品推荐

