如何在viewmodel中将imageview与drawable进行数据绑定?

时间:2019-07-28 17:06:25

标签: android kotlin mvvm android-databinding android-viewmodel

绑定适配器:

@BindingAdapter("src")
fun loadImage(imageView: ImageView, src: Any) {

    if (src is Int || src is String || src is Drawable) {
        Glide.with(imageView.context).load(src).into(imageView)
    }
}

xml中的Imageview:

<androidx.appcompat.widget.AppCompatImageView
    android:layout_width="200dp"
    android:layout_height="300dp"
    app:src="@{model.image}" />

查看模型:

val image = MutableLiveData<Drawable>()

init {
    // image.value = How to initialize this?
}

场景:
我想将imageview与从服务器收到的drawable绑定。我想设置一个可绘制的占位符,直到从服务器获取图像为止。

上述代码错误:

  

java.lang.IllegalArgumentException:指定为非null的参数为null:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数src

注意: 1.请提供遵循MVVM的解决方案。 (viewmodel中没有上下文)

2 个答案:

答案 0 :(得分:1)

您可以在Glide中设置占位符,而无需在ViewModel中进行处理。以下几行应该可以满足您的目的。

Glide.with(imageView.context).load(src).placeholder(R.drawable.placeholder).into(imageView)

请参见documentation here

答案 1 :(得分:1)

扩展@Reaz Murshed的想法,并在引用Android Binding Adapter Docs之后,为所有imageview创建了一个绑定适配器。 (所有imageview不必具有相同的占位符)

绑定适配器:

@BindingAdapter(value = ["src", "placeholderImage"], requireAll = false)
fun loadImage(imageView: ImageView, src: Int?, placeholderImage: Drawable?) {
    if (placeholderImage != null) {
        Glide.with(imageView.context).load(src).placeholder(placeholderImage).into(imageView)
    } else {
        Glide.with(imageView.context).load(src).into(imageView)
    }
}

@BindingAdapter(value = ["src", "placeholderImage"], requireAll = false)
fun loadImage(imageView: ImageView, src: String?, placeholderImage: Drawable?) {
    if (placeholderImage != null) {
        Glide.with(imageView.context).load(src).placeholder(placeholderImage).into(imageView)
    } else {
        Glide.with(imageView.context).load(src).into(imageView)
    }
}

@BindingAdapter(value = ["src", "placeholderImage"], requireAll = false)
fun loadImage(imageView: ImageView, src: Drawable?, placeholderImage: Drawable?) {
    if (placeholderImage != null) {
        Glide.with(imageView.context).load(src).placeholder(placeholderImage).into(imageView)
    } else {
        Glide.with(imageView.context).load(src).into(imageView)
    }
}

XML:

<androidx.appcompat.widget.AppCompatImageView
    android:layout_width="200dp"
    android:layout_height="300dp"
    app:placeholderImage="@{@drawable/kids_ethnic_1}"
    app:src="@{model.image}" />

如果需要,我们可以根据需要添加其他方法来制作Int或其他数据类型的占位符。