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

