1. 如何向单个view传递多个binding参数
a. 在BindingAdapter中定义
@BindingAdapter({"position", "info"})
public static void renderView(View view, int position, Info info) {
view.renderView(position, info);
}
b xml配置 position,info 属性即可。
这里点进BindingAdapter可以看到两个参数:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package android.databinding;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
public @interface BindingAdapter {
String[] value();
boolean requireAll() default true;
}
value 数组,binding的属性,requireAll是 bool参数 表示是否可选。
2 data- binding的一个bug:
当为某个view设置layout_width 时,使用官方的方法,binding一个dimen的资源会出现如下错误

目前我看到的一个workaround如下:
@BindingAdapter("height")
public static void setHeight(View view, float height) {
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = (int) height;
view.setLayoutParams(params);
}
其实就是1.提到的方法,但是我在实际使用的时候却存在空指针异常,因为view.getLayoutParams()可能为空。
这里需要判空下。
3 binding 资源 :
- res:
直接 在vm定义
xml配置public final ObservableField<Drawable> mDrawable = new ObservableField<>();
android:drawableLeft="@{viewModel.mDrawable}"
4 binding 事件
vm中定义 回调即可
public final ObservableField<View.OnClickListener> mOnClickMoreView = new ObservableField<>();
5 binding参数顺序问题
当一个view出现多个参数时,如果你不是使用BindingAdapter一起设置参数的话,而是分别设置的话,小心一下参数顺序,binding按照xml 顺序读取,也就是说,这个就存在一个优先级,后面的参数可能覆盖一些前面的参数。
6 listView Click事件处理
工程较大时,我们有一个统一的ViewModel,恰好就是这个ViewModel,造成各种兼容问题。 比如我有一个需求,ViewGroup不拦截事件,而另外的同事需要拦截该事件。有人会说onclickbinding null就好,可行,但同事又binding了一个长按事件onLongClick,ok,还继续这样做。事实是然并卵。测试了下binding clickable,binding onLongClickable才可行。
7 note
listview复用的时候,小心绑定的属性未恢复,造成复用错误。 最重要的事,编译通不过时,注意vm中属性和xml的属性值是否相同。
下图是找不到对应的Longclick错误的事例。

下面事例是没有做兼容,因为relativelayout没有对应的height属性的设置。
