Kotlin开发RecyclerView无法从itemView访问控件id怎么办
问题背景
- 学习使用Kotlin实现RecyclerView组件时,参考的教程说明可以从
itemView直接访问布局中id为tvTitle、cbDone的控件 - 实际编码时IDE没有给出对应代码提示,手动输入相关代码会直接报错,无法从
itemView访问对应控件id
根本原因
你参考的是较老版本的Android开发教程,这类教程依赖的Kotlin Android Extensions插件已经被Google官方正式废弃并移除,新版Android Studio创建的项目默认不会集成这个插件,自然不支持直接通过控件id访问视图实例的语法。
可行解决方案
你可以根据项目需求选择以下任意一种方案解决:
方案1:使用ViewBinding(官方首选推荐)
这是目前Android官方推荐的视图访问方案,具备空安全、类型安全的特性,配置步骤如下:
- 打开对应模块的
build.gradle(模块级,不是项目级),在android配置块下开启ViewBinding:
android { // 其他现有配置保持不变 buildFeatures { viewBinding true } }
- 同步Gradle配置后,修改RecyclerView的Adapter实现,通过布局自动生成的Binding类持有控件引用,参考实现:
class MyListAdapter(private val dataList: List<MyData>) : RecyclerView.Adapter<MyListAdapter.ListViewHolder>() { inner class ListViewHolder(val binding: ItemListBinding) : RecyclerView.ViewHolder(binding.root) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder { val binding = ItemListBinding.inflate( LayoutInflater.from(parent.context), parent, false ) return ListViewHolder(binding) } override fun onBindViewHolder(holder: ListViewHolder, position: Int) { val item = dataList[position] // 直接通过binding实例访问对应id的控件 holder.binding.tvTitle.text = item.title holder.binding.cbDone.isChecked = item.isDone } override fun getItemCount(): Int = dataList.size }
注意:自动生成的Binding类名和你的item布局文件名对应:如果item布局文件名为
item_list.xml,生成的Binding类就是ItemListBinding,命名规则为去掉文件名的下划线、转为大驼峰格式后追加Binding后缀。
方案2:手动调用findViewById(适合简单临时场景)
如果不想引入ViewBinding,可以在ViewHolder初始化时手动通过findViewById获取控件实例,参考代码:
inner class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val tvTitle: TextView = itemView.findViewById(R.id.tvTitle) val cbDone: CheckBox = itemView.findViewById(R.id.cbDone) }
后续在onBindViewHolder生命周期中,直接通过holder持有的控件引用操作即可。
该方案没有空安全、类型安全校验,控件id写错、类型不匹配时会在运行时才崩溃,不建议在复杂项目中使用。
方案3:回退使用废弃的Kotlin Android Extensions(极度不推荐)
如果只是想临时跑通老教程的代码,可以在模块级build.gradle中手动添加废弃插件的配置:
apply plugin: 'kotlin-android-extensions'
同步Gradle后即可恢复直接通过id访问控件的能力,但该插件已经停止维护,在新版AGP、Kotlin版本中会出现兼容性问题,绝对不要在正式生产项目中使用。
内容的提问来源于stack exchange,提问作者Anindra
相关产品推荐
相关产品推荐

