创建RecyclerView适配器时无法访问ViewHolder中的视图
解决RecyclerView适配器无法访问ViewHolder视图的问题
Hey,我来帮你搞定这个问题!你遇到的无法访问ViewHolder中视图的问题,核心原因是你的ViewHolder没有正确持有布局内的视图引用——当前代码里的mTextView是onCreateViewHolder方法里的局部变量,ViewHolder根本碰不到它。下面给你一步步修正方案:
核心修正思路
- 让
ViewHolder类内部持有需要操作的视图作为成员变量,这样在onBindViewHolder里就能通过ViewHolder实例访问到这些视图 - 用规范的方式把布局视图传递给ViewHolder,再由ViewHolder从根视图中获取控件引用
修正后的完整代码
private class Adapter(private val list: List<HashMap<String, Any>>, private val ctx: Context) : RecyclerView.Adapter<Adapter.ViewHolder>() { // 定义ViewHolder,内部持有TextView成员变量 inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { // 从根视图中获取TextView引用(需要先给TextView设置id) val itemTextView: TextView = itemView.findViewById(R.id.item_content_text) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter.ViewHolder { // 创建Anko DSL布局,给TextView设置id方便后续查找 val itemRootView = ctx.UI { relativeLayout { textView("1 + 1 = 2") { // 记得先在res/values/ids.xml里定义这个id:<item name="item_content_text" type="id"/> id = R.id.item_content_text } } }.view // 把根视图传给ViewHolder,创建实例返回 return ViewHolder(itemRootView) } override fun getItemCount() = list.size override fun onBindViewHolder(holder: ViewHolder, position: Int) { // 现在可以轻松访问ViewHolder里的TextView了! val currentItem = list[position] holder.itemTextView.text = currentItem["display_text"].toString() // 还可以在这里设置点击事件、样式等 holder.itemTextView.setOnClickListener { // 处理点击逻辑 } } }
额外说明
- 关于ID的设置:如果你还没定义
item_content_text这个id,需要在res/values/ids.xml文件里添加一行:<item name="item_content_text" type="id"/>,这样就能通过findViewById找到对应的控件了。 - 简化写法(可选):如果你不想手动写id,也可以在创建Anko布局时直接把TextView引用传递给ViewHolder,但用id查找的方式更符合RecyclerView适配器的规范,代码可读性也更强。
- 内部类的
inner关键字:这里把ViewHolder设为inner类是为了方便后续如果需要访问外部Adapter的成员变量,要是只是单纯持有视图,不加inner也可以正常工作。
内容的提问来源于stack exchange,提问作者Burak
相关产品推荐
相关产品推荐

