如何使用 Glide 数据绑定图像加载?

Has*_*cuk 13 android kotlin android-databinding

我正在尝试使用数据绑定加载图像。但我从来没有克服它。我的问题在哪里?下面是我的代码和布局结构。

MyItemViewModel.kt

  @BindingAdapter("imageUrl")
    fun loadImage(view: RoundedImageView, url: String) = Glide.with(view.context).load(url).into(view)
Run Code Online (Sandbox Code Playgroud)

布局文件

<data>

    <variable
            name="viewModel"
            type="com.myapp.app.ui.activity.albumlist.AlbumItemViewModel"/>
</data>

  <com.makeramen.roundedimageview.RoundedImageView
                android:layout_width="60dp"
                android:id="@+id/ivRoundedAlbum"
                android:layout_marginStart="@dimen/unit_20_dp"
                app:riv_corner_radius="8dp"
                app:imageUrl="@{viewModel.data.cover}"
                android:layout_height="60dp"/>
Run Code Online (Sandbox Code Playgroud)

Igo*_*sky 8

您需要使url参数可以为空,并像这样防止空值:

@BindingAdapter("imageUrl")
fun loadImage(view: RoundedImageView, url: String?) {
    if (!url.isNullOrEmpty()) {
        .....
    }
}
Run Code Online (Sandbox Code Playgroud)


Jee*_*ede 5

BindingAdapter方法应该是static,因此@JvmStatic在这种情况下标记它会有所帮助。

但这会产生“编译时错误”,即“方法在类内不能是静态的”,因此应将其移至伴随对象命名对象

在您的情况下,您在类成员级别拥有方法,因此将其移动到伴随对象会有所帮助。因此,对于MyItemViewModel.ktmake 伴随对象和移动方法,如下所示:

class MyItemViewModel{
    //Some code
    companion object {

        @JvmStatic
        @BindingAdapter("imageUrl")
        fun loadImage(view: RoundedImageView, url: String) { // This methods should not have any return type, = declaration would make it return that object declaration.
            Glide.with(view.context).load(url).into(view)
        }
    }
    //Some other code
}
Run Code Online (Sandbox Code Playgroud)

注意:还要删除带有=. 绑定方法应该有返回类型Unit


编辑:也可以使用Glide.with(view)@hmac 在评论中建议的方法,但是......

使用前需要考虑的事项Glide.with(view)

  1. 在从 Activity/Fragment 使用它之前,应该附加您的视图。此方法的最佳用例是自定义视图/视图组。

  2. 在使用此方法之前考虑布局层次结构,因为不鼓励使用该方法的嵌套/大型层次结构布局过多。这种布局变得低效。

  3. 另请注意,如果视图在不支持的片段类中或上下文属于不支持的片段,则可能会产生嘈杂的日志,如文档所示,请 在使用此方法之前先迁移到支持库(现在被视为 AndroidX)