Jetpack之DataBinding

使用BaseAdapter对不可直接绑定的组件绑定数据

以ImageView为例,显示图片时需要使用到glide,因此可以定义一个类,用@BindingAdapter来注解用于处理图片的方法:

public class IVBindingAdapter {
    @BindingAdapter("image")
    public static void setImage(ImageView imageView,String url){
        if (!TextUtils.isEmpty(url)){
            Glide.with(imageView)
                    .load(url)
                    .into(imageView);
        }
    }
}

@BindingAdapter括号内的字符串即是在ImageView组件中需要使用的属性(用法类似include传参),例如此时括号内定义的value是”image”,那么在ImageView中需要传入image属性:

        <ImageView
            android:id="@+id/imageView"
            app:image="@{networkImage}" />

由于value可以传入一个数组

因此可以传入多个参数,并通过requireAll来配置是否需要全部传入:

public class IVBindingAdapter {
    @BindingAdapter(value = {"image","default_image"},requireAll = false)
    public static void setImage(ImageView imageView,String url,int res){
        if (!TextUtils.isEmpty(url)){
            Glide.with(imageView)
                    .load(url)
                    .placeholder(R.drawable.ic_launcher_background)
                    .into(imageView);
        }else {
            Glide.with(imageView)
                    .load(res)
                    .placeholder(R.drawable.ic_launcher_background)
                    .into(imageView);        }
    }
}

在xml中也需要传入这两个参数:

        <ImageView
            android:id="@+id/imageView"
            app:image="@{networkImage}"
            app:default_image="@{localImage}" />

发表评论