如何在 viewmodel 中将 imageview 与 drawable 进行数据绑定?
How to databind imageview with drawable in 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中的图像视图:
<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 与从服务器接收到的可绘制对象绑定。我想设置一个可绘制的占位符,直到从服务器获取图像。
以上代码错误:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter src
注:
1.请提供遵循MVVM的解决方案。 (视图模型中没有上下文)
您可以在 Glide 中设置占位符,而不是在 ViewModel
中进行处理。只需以下行即可满足您的目的。
Glide.with(imageView.context).load(src).placeholder(R.drawable.placeholder).into(imageView)
扩展@Reaz Murshed 的想法并在参考 Android Binding Adapter Docs 之后,我为所有图像视图创建了一个绑定适配器。 (所有图像视图不需要有相同的占位符)
绑定适配器:
@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
或其他数据类型的占位符。
绑定适配器:
@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中的图像视图:
<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 与从服务器接收到的可绘制对象绑定。我想设置一个可绘制的占位符,直到从服务器获取图像。
以上代码错误:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter src
注: 1.请提供遵循MVVM的解决方案。 (视图模型中没有上下文)
您可以在 Glide 中设置占位符,而不是在 ViewModel
中进行处理。只需以下行即可满足您的目的。
Glide.with(imageView.context).load(src).placeholder(R.drawable.placeholder).into(imageView)
扩展@Reaz Murshed 的想法并在参考 Android Binding Adapter Docs 之后,我为所有图像视图创建了一个绑定适配器。 (所有图像视图不需要有相同的占位符)
绑定适配器:
@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
或其他数据类型的占位符。