You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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 {
            // 处理点击逻辑
        }
    }
}

额外说明

  1. 关于ID的设置:如果你还没定义item_content_text这个id,需要在res/values/ids.xml文件里添加一行:<item name="item_content_text" type="id"/>,这样就能通过findViewById找到对应的控件了。
  2. 简化写法(可选):如果你不想手动写id,也可以在创建Anko布局时直接把TextView引用传递给ViewHolder,但用id查找的方式更符合RecyclerView适配器的规范,代码可读性也更强。
  3. 内部类的inner关键字:这里把ViewHolder设为inner类是为了方便后续如果需要访问外部Adapter的成员变量,要是只是单纯持有视图,不加inner也可以正常工作。

内容的提问来源于stack exchange,提问作者Burak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:55:26