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

Android Kotlin使用RecyclerView无内容、Adapter的onCreateViewHolder不触发问题

问题根因与修复方案

1. 为什么onCreateViewHolder的日志没有输出、屏幕无内容

RecyclerView加载列表的流程是先调用getItemCount()获取总条目数,只有当总条目数>0时,才会调用onCreateViewHolder创建条目视图。你的代码里list初始化是空数组,且你把list赋值的逻辑放到了onCreateViewHolder里,就形成了死循环:

  • getItemCount返回0 → RecyclerView认为没有条目需要渲染 → 不会调用onCreateViewHolder → list永远不会被赋值 → getItemCount永远返回0
    这就是日志没输出、屏幕空白的核心原因。

2. 现有代码的其他错误

  • onBindViewHolder里写了遍历整个list的for循环:onBindViewHolder是每个条目渲染时单独回调一次,参数position就是当前需要渲染的条目下标,不需要循环,你现在的写法即使列表能加载,所有条目也都会显示list的最后一个值。
  • item_custom_row.xml第一行残留了enter code here无效代码,可能导致布局解析异常。
  • 给list添加数据的getItemList逻辑冗余,不需要反复赋值。

3. 修复代码

修复后的DetailViewAdapter代码

inner class DetailViewAdapter : RecyclerView.Adapter<DetailViewAdapter.ViewHolder>() {
    // 初始化时就加载数据,确保getItemCount返回正确值
    private val list = getItemList()
    var logTag : String? = "로그 MainActivity"

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DetailViewAdapter.ViewHolder {
        Log.d(logTag,"onCreateViewHolder11 is called")
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_custom_row, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        Log.d(logTag,"onBindViewHolder is called position: $position")
        // 直接用当前position取对应数据赋值给tv_item_name
        holder.tvItem.text = list[position]
    }

    override fun getItemCount(): Int = list.size

    private fun getItemList(): ArrayList<String> {
        val list = ArrayList<String>()
        for (i in 1..8) {
            list.add("Item $i")
        }
        return list
    }

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val tvItem : TextView = view.findViewById(R.id.tv_item_name)
        val cardViewItem : CardView = view.findViewById(R.id.card_view_item)
    }
}

修复item_custom_row.xml

删掉第一行的enter code here无效字符即可。

4. tv_item_name赋值说明

你已经在ViewHolder中通过findViewById绑定了tv_item_name控件的id,只需要在onBindViewHolder回调中,通过holder.tvItem就能拿到对应控件实例,调用text属性赋值即可,不需要额外操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:09:01