android - Android 中的 BindingAdapter
问题描述
我正在学习这门关于 RecyclerView 和数据绑定的课程。
除了制作自定义/更复杂的设置器BindingAdapter
之外,使用“正常”方式有什么好处?性能有提升吗?
版本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 }
绑定工具:
@BindingAdapter("sleepDurationFormatted") fun TextView.setSleepDurationFormatted(item: SleepNight){ text = convertDurationToFormatted(item.startTimeMilli, item.endTimeMilli, context.resources) }
解决方案
Binding Adapter 为您提供了一个很好的自定义视图功能。好像很奇怪!。
首先,假设您有一个显示国旗的 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 可以提高性能。
推荐阅读
- python - 无法让 AWS SAM CLI 与 Python 3.5.x 一起使用
- reactjs - 没有关于 getByRole、queryByRole 等的建议
- flutter - RangeError(索引):无效值:不在包含范围 0..1:2
- javascript - Node.js HTTP 服务器在 POST 表单提交后发送 HTML 文件(无 Express)
- php - 如何在 laravel 中格式化 curl
- python - 我希望“编辑”按钮打开一个新窗口,然后能够编辑显示屏上的值
- vue.js - vue.config.js [transpileDependencies] 不起作用
- c - 使用 c 宏生成函数名
- python - Pandas:重复列值 n 次并滚动未来日期
- types - 朱莉娅: ceil/floor 可以返回一个整数吗?