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

Kotlin中ViewBinding下RecyclerView不显示且仅能调用getItemCount()问题

RecyclerView不显示+仅触发getItemCount()问题排查

以下是针对问题的核心排查点,按优先级排序:

1. 确认RecyclerView已设置LayoutManager

这是最常见的遗漏点——RecyclerView必须绑定LayoutManager才能渲染Item,否则即使Adapter有数据也不会显示。

// 在Fragment的onViewCreated中添加
binding.rv_contacts.layoutManager = LinearLayoutManager(requireContext())
// 或GridLayoutManager等其他布局管理器

2. 检查RecyclerView的布局参数

确保RecyclerView的宽高设置正确,避免因wrap_content导致的尺寸计算错误:

<!-- 错误示例:宽高wrap_content可能导致视图被压缩 -->
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rv_contacts"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

<!-- 正确示例:使用match_parent填充父容器 -->
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rv_contacts"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

3. 验证Adapter数据源与更新逻辑

  • 确认传给Adapter的数据源非空且getItemCount()返回值大于0
  • 数据更新后必须调用notifyDataSetChanged()(或更细粒度的notifyItemXXX方法)通知Adapter刷新:
// 初始化时确保数据源有数据
val contactList = mutableListOf(
    Contacts("张三", "13800000000"),
    Contacts("李四", "13900000000")
)
val adapter = ContactsAdapter(contactList)
binding.rv_contacts.adapter = adapter

// 数据更新时必须通知
contactList.add(Contacts("王五", "13700000000"))
adapter.notifyDataSetChanged()

4. 检查ViewBinding初始化与视图引用

确认Fragment中正确使用ViewBinding获取RecyclerView实例,避免空引用或错误的视图查找:

class ContactsFragment : Fragment() {
    private var _binding: FragmentContactsBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentContactsBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 必须通过binding获取RecyclerView
        val adapter = ContactsAdapter(...)
        binding.rv_contacts.layoutManager = LinearLayoutManager(requireContext())
        binding.rv_contacts.adapter = adapter
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null // 避免内存泄漏
    }
}

5. 排查Adapter的ViewHolder实现

检查onCreateViewHolder和onBindViewHolder是否正确实现:

  • onCreateViewHolder必须正确填充Item布局并传入parent参数,确保布局尺寸适配RecyclerView
  • onBindViewHolder必须正确绑定数据到Item视图
class ContactsAdapter(private val contactList: List<Contacts>) : RecyclerView.Adapter<ContactsAdapter.ContactsViewHolder>() {

    inner class ContactsViewHolder(val binding: ItemContactBinding) : RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContactsViewHolder {
        // 正确方式:使用ViewBinding填充布局并传入parent
        val binding = ItemContactBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ContactsViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ContactsViewHolder, position: Int) {
        val contact = contactList[position]
        // 确保正确绑定数据到Item视图
        holder.binding.tvName.text = contact.name
        holder.binding.tvPhone.text = contact.phone
    }

    override fun getItemCount(): Int = contactList.size
}

6. 检查Item布局的根视图属性

确保Item布局的根视图宽高设置合理,避免因高度为0导致Item不可见:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" <!-- 必须设置为wrap_content或固定高度 -->
    android:padding="16dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"/>

    <TextView
        android:id="@+id/tvPhone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textColor="@android:color/darker_gray"/>
</LinearLayout>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:37:05