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>
额外需要检查的点
- 方法访问权限:确保ViewHolder里的
onTextChanged和onTextClicked方法是public的(Kotlin里默认就是public,只要没加private修饰符就没问题),Data Binding需要访问这些方法才能绑定监听器。 - Data Binding是否启用:检查你的app模块build.gradle里是否开启了Data Binding:
(如果是旧版Gradle,用android { ... buildFeatures { dataBinding true } }dataBinding { enabled = true }) - 重新生成BR类:修改变量名后,建议执行
Clean Project再Rebuild Project,确保自动生成的BR类更新到最新状态。
按照上面的步骤修改后,你的监听器应该就能正常触发了!
内容的提问来源于stack exchange,提问作者Niels
相关产品推荐
相关产品推荐

