DataBinding之 自定义属性 Binding adapters
上一章我们主要讲解了简单的文字绑定操作,这一章我们讲一下复杂的数据绑定,例如图片加载。
@BindingAdapter 注解
databinding中自定义属性依赖于注解 @BindingAdapter
- 作用于方法(和类无关,这个自定义属性的方法可以写在任何地方)
- 它定义了xml的属性赋值的java实现(注解的方法中就是我们对这个控件进行处理)
- 方法必须为公共静(public static)方法,可以有一到多个参数。
简单实用
直接上代码
//“app:imgUrl” 这就是在xml中的属性
@android.databinding.BindingAdapter("app:imgUrl")
public static void setImgUrl(ImageView imageView, String url) {
GlideApp.with(imageView)
.load(url)
.into(imageView);
}
xml 中使用
<ImageView
android:id="@+id/img_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
app:imgUrl="@{user.url}"
/>
多参数使用
继续上代码
@android.databinding.BindingAdapter(value = {"app:imgUrl", "app:placeholder"}, requireAll = false)
public static void loadImg(ImageView imageView, String url, Drawable placeholder) {
GlideApp.with(imageView)
.load(url)
.placeholder(placeholder)
.into(imageView);
}
xml中代码
<ImageView
android:id="@+id/img_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
app:imgUrl="@{user.url}"
app:placeholder="@{@drawable/ic_launcher_background}"
/>
这里 requireAll = false
表示我们可以使用这两个两个属性中的任一个或同时使用,如果requireAll = true
则两个属性必须同时使用,不然报错。默认为 true。
xml 中@{@drawable/ic_launcher_background}
引用的是资源文件中的图片
使用属性旧值
@BindingAdapter 自定义属性可以使用属性旧值,即上一次设置的属性值
上代码
@android.databinding.BindingAdapter(value = {"app:imgUrl", "app:placeholder"}, requireAll = false)
public static void loadImg(ImageView imageView, String oldUrl, Drawable oldError, String newUrl, Drawable newError) {
GlideApp.with(imageView)
.load(newUrl)
.placeholder(oldError)
.into(imageView);
}
这里要注意一点:如果是多个属性,那么方法的参数必须要把所有的属性的旧值列举出来,然后在列举属性新值。这个顺序是不能乱的。并不是一个属性旧值跟一个属性新值。