JetPack学习笔记之DataBinding(四)
为了让布局文件能够承担更多的工作,处理更复杂的业务逻辑,DataBinding库允许我们自定义BindAdapter,下面将通过ImageView演示如何自定义BindAdapter。
1、准备工作,添加Picasso依赖,分配网络权限。
implementation 'com.squareup.picasso:picasso:2.71828'
<uses-permission android:name="android.permission.INTERNET"/>
2、编写处理图片的BindAdapter类。
/**
* 项目名称 JetPackPro
* 创建人 xiaojinli
* 创建时间 2020/8/7 12:19 PM
**/
public class ImageViewBindingAdapter {
@BindingAdapter("image")
public static void setImage(ImageView imageView,String imageUrl){
if(!TextUtils.isEmpty(imageUrl)){
Picasso.get()
.load(imageUrl)
.placeholder(R.mipmap.ic_launcher_round)
.error(R.drawable.ic_launcher_background)
.into(imageView);
}else{
imageView.setBackgroundColor(Color.BLACK);
}
}
}
注意
- 其中的方法均为静态方法,第一个参数为调用者本身,第二个参数是布局文件在调用该方法时需要传递过来的参数。
- 在静态方法前添加注解
3、在布局文件中使用BindAdapter类
首先在布局文件中定义一个变量,用于存放网络图片的地址。
<variable
name="networkImage"
type="String" />
在ImageView中通过标签调用静态方法
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
app:image="@{networkImage}"/>
4、在Activity中为布局变量赋值
binding.setNetworkImage("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1337486992,1705035034&fm=26&gp=0.jpg");
运行结果如下:
在BindingAdapter中使用重载方法。
比如可以定义如下的重载方法:
/**
* 显示本地图片
* @param imageView
* @param localImage
*/
@BindingAdapter("image")
public static void setImage(ImageView imageView,int localImage){
imageView.setImageResource(localImage);
}
在布局文件中的使用方式与上面相同,都是先定义变量,然后在View中调用
<data>
<variable
name="localImage"
type="int" />
</data>
...
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
app:image="@{localImage}"/>
在Activity中传入参数值
binding.setLocalImage(R.mipmap.localimage);