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
相关产品推荐
相关产品推荐

