You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:45:04