Android 中的绑定适配器
BindingAdapter in Android
我正在关注有关 RecyclerView 和数据绑定的 course。
我读过What is the use of binding adapter in Android?。
除了 make custom/more complex setter,使用 BindingAdapter
比 "normal" 有什么好处?性能有提升吗?
版本 1:
xml:
<TextView
android:id="@+id/sleep_length"
android:layout_width="0dp"
android:layout_height="20dp"
...
tools:text="Wednesday" />
适配器:
fun bind(item: SleepNight) {
val res = itemView.context.resources
sleepLength.text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, res)
}
版本 2(数据绑定):
xml:
<TextView
android:id="@+id/sleep_length"
android:layout_width="0dp"
android:layout_height="20dp"
app:sleepDurationFormatted="@{sleep}"
...
tools:text="Wednesday" />
适配器:
fun bind(item: SleepNight) {
binding.sleep = item
}
BindingUtils:
@BindingAdapter("sleepDurationFormatted")
fun TextView.setSleepDurationFormatted(item: SleepNight){
text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, context.resources)
}
绑定适配器在自定义视图方面为您提供了一个非常好的功能。
看起来很奇怪!
首先,假设你有一个显示国旗的ImageView。
接受:国家代码(字符串)
动作:显示国家的国旗,如果国家代码为空,则使ImageView GONE。
@BindingAdapter({"android:setFlag"})
public static void setFlagImageView(ImageView imageView, String currencyCode) {
Context context = imageView.getContext();
if (currencyCode != null) {
try {
Drawable d = Drawable.createFromStream(context.getAssets().open("flags/"+currencyCode.toLowerCase()+".png"), null);
imageView.setImageDrawable(d);
} catch (IOException e) {
e.printStackTrace();
}
}
else{
imageView.setVisibility(View.GONE);
}
}
所以现在您可以在任何其他地方重用这个 BindinAdapter。
喜欢 DataBinding 的人,看到他们可以减少代码量并在 xml 中编写一些逻辑。而不是辅助方法。
其次,通过数据绑定,你将忽略findViewById,因为会为你创建一个生成的文件。
关于性能,我没有在官方文档中找到任何表明 BindingAdapter 提高性能的信息。
我正在关注有关 RecyclerView 和数据绑定的 course。
我读过What is the use of binding adapter in Android?。
除了 make custom/more complex setter,使用 BindingAdapter
比 "normal" 有什么好处?性能有提升吗?
版本 1:
xml:
<TextView android:id="@+id/sleep_length" android:layout_width="0dp" android:layout_height="20dp" ... tools:text="Wednesday" />
适配器:
fun bind(item: SleepNight) { val res = itemView.context.resources sleepLength.text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, res) }
版本 2(数据绑定):
xml:
<TextView android:id="@+id/sleep_length" android:layout_width="0dp" android:layout_height="20dp" app:sleepDurationFormatted="@{sleep}" ... tools:text="Wednesday" />
适配器:
fun bind(item: SleepNight) { binding.sleep = item }
BindingUtils:
@BindingAdapter("sleepDurationFormatted") fun TextView.setSleepDurationFormatted(item: SleepNight){ text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, context.resources) }
绑定适配器在自定义视图方面为您提供了一个非常好的功能。 看起来很奇怪!
首先,假设你有一个显示国旗的ImageView。
接受:国家代码(字符串)
动作:显示国家的国旗,如果国家代码为空,则使ImageView GONE。
@BindingAdapter({"android:setFlag"})
public static void setFlagImageView(ImageView imageView, String currencyCode) {
Context context = imageView.getContext();
if (currencyCode != null) {
try {
Drawable d = Drawable.createFromStream(context.getAssets().open("flags/"+currencyCode.toLowerCase()+".png"), null);
imageView.setImageDrawable(d);
} catch (IOException e) {
e.printStackTrace();
}
}
else{
imageView.setVisibility(View.GONE);
}
}
所以现在您可以在任何其他地方重用这个 BindinAdapter。
喜欢 DataBinding 的人,看到他们可以减少代码量并在 xml 中编写一些逻辑。而不是辅助方法。
其次,通过数据绑定,你将忽略findViewById,因为会为你创建一个生成的文件。
关于性能,我没有在官方文档中找到任何表明 BindingAdapter 提高性能的信息。