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

Android XML监听器绑定未执行,附自定义RecyclerAdapter及布局代码

解决Data Binding中RecyclerView ViewHolder监听器绑定不执行的问题

嘿,我一眼就看到了你的代码里最核心的问题——Variable名称不匹配,这直接导致监听器找不到对应的ViewHolder方法,自然不会执行。咱们一步步来排查和解决:

核心问题:Variable名称不匹配

你在ViewHolder的bind方法里设置的是:

binding.setVariable(BR.viewHolder, this)

但在XML的<data>块里定义的变量名是holder:

<variable name="holder" type="(...).adapters.ContactPropertyRecyclerAdapter.ViewHolder" />

Data Binding会根据XML里的变量名自动生成BR类的字段,所以这里应该是BR.holder而不是BR.viewHolder,两者不匹配就导致ViewHolder实例没有被正确绑定到XML的变量上,监听器调用时找不到目标方法。

解决办法(二选一即可)

方法1:修正bind方法里的BR字段

把BR.viewHolder改成BR.holder,和XML的变量名保持一致:

inner class ViewHolder(private val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) { 
    fun bind(obj: Any) { 
        binding.setVariable(BR.holder, this) // 这里改成BR.holder
        binding.setVariable(BR.obj, obj) 
        binding.executePendingBindings() 
    } 
    // 方法保持不变
    fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { 
        Log.i("test", "Change is here!") 
    } 
    fun onTextClicked() { 
        Log.i("test", "Click is here!") 
    } 
}

方法2:修正XML里的变量名

把XML里的变量名改成viewHolder,匹配bind方法里的BR.viewHolder,同时对应的监听器调用也要修改:

<data> 
    <variable name="viewHolder" type="(...).adapters.ContactPropertyRecyclerAdapter.ViewHolder" /> 
    <variable name="obj" type="(...).models.Address" /> 
</data> 
<android.support.constraint.ConstraintLayout ...> 
    <EditText 
        ...
        android:onTextChanged="@{(s, start, before, count) -> viewHolder.onTextChanged(s, start, before, count)}" 
        android:onClick="@{() -> viewHolder.onTextClicked()}" 
        ... /> 
</android.support.constraint.ConstraintLayout>

额外需要检查的点

  1. 方法访问权限:确保ViewHolder里的onTextChanged和onTextClicked方法是public的(Kotlin里默认就是public,只要没加private修饰符就没问题),Data Binding需要访问这些方法才能绑定监听器。
  2. Data Binding是否启用:检查你的app模块build.gradle里是否开启了Data Binding:
    android {
        ...
        buildFeatures {
            dataBinding true
        }
    }
    
    (如果是旧版Gradle,用dataBinding { enabled = true })
  3. 重新生成BR类:修改变量名后,建议执行Clean Project再Rebuild Project,确保自动生成的BR类更新到最新状态。

按照上面的步骤修改后,你的监听器应该就能正常触发了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:55:12