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

RecyclerView Adapter使用View Binding报Missing required view with ID错误如何解决

错误原因
  • Binding类匹配错误:你创建ViewHolder时加载的是列表项布局R.layout.item_view,但用了对应Activity主布局的ActivityMainBinding去绑定item的view,两个布局结构完全不匹配,主布局存在的app_nameid在item布局中不存在,绑定阶段就会抛出找不到对应view的空指针异常。
  • 控件归属逻辑错误:SlidingUpPanelLayout(id为mainFrame)属于Activity的主布局,不在RecyclerView的子项布局内,你不可能在Adapter的ViewHolder里直接拿到这个控件实例,就算Binding类用对了也找不到对应控件。
修改方案

首先确保你的module级build.gradle已经开启ViewBinding:

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

1. 修正Adapter逻辑,用接口回调传递点击事件

系统会为R.layout.item_view自动生成对应的ItemViewBinding类,Adapter中改用这个类,同时把item点击事件通过回调传给Activity处理:

// recyclerview adapter
class RecyclerViewAdapter(
    val itemList: ArrayList<MainActivity.CoinList>,
    // 新增点击回调参数
    val onItemClick: () -> Unit
) : RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>(), Filterable {
    private var searchList: ArrayList<MainActivity.CoinList>? = null

    class ViewHolder(val binding: ItemViewBinding) : RecyclerView.ViewHolder(binding.root) {
        // 直接通过Binding拿控件,无需findViewById
        val name get() = binding.coinName
        val count get() = binding.coinCount
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ItemViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = itemList[position]
        holder.name.text = item.name
        holder.count.text = item.count
        holder.itemView.setOnClickListener {
            // 触发回调,把点击事件交给上层处理
            onItemClick.invoke()
        }
    }

    override fun getItemCount(): Int {
        return itemList.size
    }
    // 原有Filter相关逻辑保留即可
}

2. Activity中处理滑面板操作

在Activity初始化Adapter时传入回调,直接操作Activity自身布局里的SlidingUpPanelLayout:

// Activity中初始化Adapter的代码
val adapter = RecyclerViewAdapter(你的数据列表) {
    // mainBinding是你Activity自身的ViewBinding实例
    val slidePanel = mainBinding.mainFrame
    val state = slidePanel.panelState
    if (state == SlidingUpPanelLayout.PanelState.COLLAPSED) {
        slidePanel.panelState = SlidingUpPanelLayout.PanelState.ANCHORED
    } else if (state == SlidingUpPanelLayout.PanelState.EXPANDED) {
        slidePanel.panelState = SlidingUpPanelLayout.PanelState.COLLAPSED
    }
}
recyclerview.adapter = adapter

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:54:05