Android Data Binding中如何在BindingAdapter里传递多个View作为参数
基于Data Binding BindingAdapter实现图片加载状态联动控件可见性方案
以下方案以常用的Glide图片加载框架为例,若使用其他图片加载框架仅需替换对应加载监听逻辑即可。
1. 实现自定义BindingAdapter
给ImageView扩展绑定属性,同时接收图片地址和错误展示的RelativeLayout,在加载回调中切换两者可见性:
import android.view.View import android.widget.ImageView import android.widget.RelativeLayout import androidx.databinding.BindingAdapter import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import android.graphics.drawable.Drawable @BindingAdapter(value = ["bind:imageUrl", "bind:errorContainer"], requireAll = true) fun ImageView.loadImageByUrlWithState(imgUrl: String?, errorContainer: RelativeLayout) { // 加载初始状态:显示图片控件,隐藏错误容器 this.visibility = View.VISIBLE errorContainer.visibility = View.GONE Glide.with(this.context) .load(imgUrl) .listener(object : RequestListener<Drawable> { override fun onLoadFailed( e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean ): Boolean { // 加载失败:隐藏图片控件,显示错误容器 this@loadImageByUrlWithState.visibility = View.GONE errorContainer.visibility = View.VISIBLE return false } override fun onResourceReady( resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean ): Boolean { // 加载成功:显示图片控件,隐藏错误容器 this@loadImageByUrlWithState.visibility = View.VISIBLE errorContainer.visibility = View.GONE return false } }) .into(this) }
2. 布局文件中配置绑定
确保布局已开启DataBinding(外层包裹layout标签),直接给ImageView绑定对应属性即可:
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto"> <data> <!-- 可替换为自己的ViewModel变量,这里直接用图片地址字符串举例 --> <variable name="targetImageUrl" type="java.lang.String" /> </data> <FrameLayout android:layout_width="match_parent" android:layout_height="200dp"> <!-- 加载错误展示的RelativeLayout,自定义内部内容即可 --> <RelativeLayout android:id="@+id/error_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f5f5f5"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="图片加载失败,请点击重试"/> </RelativeLayout> <!-- 图片展示控件 --> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" bind:imageUrl="@{targetImageUrl}" bind:errorContainer="@{error_layout}" /> </FrameLayout> </layout>
3. 注意事项
- 需要提前在项目
build.gradle中开启DataBinding,同时引入对应图片加载框架的依赖 - 若使用Coil、Picasso等其他图片加载框架,仅需替换BindingAdapter中的图片加载逻辑,保留加载成功、失败的可见性切换逻辑即可
- 若需要支持加载中占位、点击重试等逻辑,可扩展BindingAdapter的自定义属性,新增对应的参数配置即可
- 若项目使用Java开发,将BindingAdapter逻辑写为public静态方法即可,布局绑定逻辑无需调整
内容的提问来源于stack exchange,提问作者richa zyretech
相关产品推荐
相关产品推荐

