我一直在阅读有关Android中的绑定适配器的文章,但我似乎不太了解。 什么时候使用绑定适配器? 有人可以用一个简单的例子来解释吗?
我读过的一篇文章在主活动中有一个绑定适配器。绑定适配器有一个参数“ toastMessage”,显然,只要“ toastMessage”(它是viewModel类的一个属性)发生更改,就可以调用此绑定适配器注释的方法。
我不明白为什么我们需要这样做。
用一个简单的例子进行解释会很有帮助。
谢谢!
答案 0 :(得分:1)
绑定适配器用于为视图的某些属性提供自定义设置器。我能想到的最常见的用例是将图像设置为ImageView
,其中图像的加载大部分是通过UI线程完成的。
我们大多数人都有我们首选的图像加载库来加载图像。对于您要加载的每个图像,您将编写代码以从远程(或本地)加载url并将其设置为我们的图像视图。一旦在有图像视图的每个位置看到样板,您当然可以使用一些实用方法。
绑定适配器使此操作更加简单。您在XML中设置属性,数据绑定库将查找绑定适配器以将该属性设置为您的视图。由于数据是可观察的,因此每当数据更改时,都会触发视图更改。
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:imageUrl="@{data.imageUrl}"/>
@BindingAdapter("imageUrl")
public static void setImageUrl(ImageView imageView, String url) {
if (url == null) {
imageView.setImageDrawable(null);
} else {
Picasso.get().load(url).into(imageView); // replace with your fav image loading lib
}
}
doc提供了一些您想在其中使用的示例。乔治·芒特(George Mount)的article还非常清楚地说明了如果使用数据绑定时可能在何处以及为什么要使用它。
答案 1 :(得分:0)
绑定适配器负责进行适当的框架调用以设置值。
在应用程序中使用data binding
时,在views
中设置值是很正常的事情。如下例所示:
<ProgressBar
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:visibility="@{viewmodel.loadingData?View.VISIBLE:View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
但是有时候您想在设置方法中做一些特别的事情。例如,您在RecyclerView
中有一个XML
,并且想要定义其适配器,可以通过在代码中通过bindingAdapter
对其进行定义来实现。
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_main_articles"
app:adapter="@{viewmodel.articles}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_width="0dp"
android:layout_height="0dp"/>
绑定适配器主要有两种用法:
1-对于RecyclerView:
@JvmStatic
@BindingAdapter("app:adapter")
fun <T> setItems(recyclerView: RecyclerView, items: List<T>?) {
Log.d(TAG, "articles:[$items]")
if (recyclerView.adapter is HomeAdapter) {
if (items != null) {
(recyclerView.adapter as HomeAdapter).swapData(items)
}
}
}
2-用于将图像加载到您的ImageView
中
@JvmStatic
@BindingAdapter("app:loadImage")
fun setImageResource(view: ImageView, imageUrl: String?) {
val context = view.context
val options = RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
imageUrl?.let {
Glide.with(context)
.setDefaultRequestOptions(options)
.load(imageUrl)
.transition(DrawableTransitionOptions.withCrossFade(1000))
.into(view)
}
}
更多信息:link