接下来我们来看一下如何使用。
要使用首先需要在Android Studio的build.gradle中添加
android{
......
dataBinding{
enabled = true
}
}
这样就成功使用了。创建了dataBinding的使用环境。
接下来我们看一下dataBinding的基础使用。
1.Layout文件改写
<layout?
//原来的layout
</layout>
2.去除findViewById
a) No more findViewById
b) Binding.xxxView
3.UI/事件绑定
a) Bind UI
setVariable、setXXX
b) 事件
android:onClick
android:onLongClick
android:onTextChanged
....
现在我们对DataBinding的用法有了一定的了解。下面我们看一下DataBinding的原理。
1.android.binding
2.BR
3.XxxBinding
主要性能:
1. 0反射
- 2. findViewById需要遍历整个ViewGroup,现在只需要做一次
- 3. 使用位标记来检验更新
- 4. 数据改变在下一次批量更新的时候才会触发操作。
- 5. 缓存表达式,如:
a?(b?c:d):e
f?(b?c:d):f
表达式在第一次使用过之后,会被记录,第二次使用不会再做操作,直接使用此表达式的值。
那么DataBinding支持哪些呢?
1.二元 & | ^
2.一元 + - ! ~
3.移位 >> >>> <<
4.比较 == > < >= <=
5.Instanceof
6.Grouping()
7.文字 character,String,numeric,null
8.Cast
9.方法调用
10.Field访问
11.Array访问[ ]
12.三元 ?:
缺省,尽管如此,我们还是有许多表达式是在DataBinding里不支持的。
1.this
2.super
3.New
4.显示泛型调用
表达式空合并运算符
取非空表达式android:text=”@{user.displayName??user.lastName}”等同于
完全版
android:text=”@{user.displayName!=null?user.displayName:user.lastName}”
表达式例子:
Margin @dimen+
android:text=”@{String.valueOf(indext+1)}”
View.VISIBLE”
transitionName=’@{“image_”+id}’
避免空指针
1.自动空指针检查
{user.name}->null
{user.age}->0
2.数组越界
Include
1.Bind
< include layout = “@layout/name”bind:user=”@{user}”/>
2.尚不支持direct child,如root为merge
高级绑定:
RecylerView
onBindVIewHolder
final T item = mItems.get(position);
holder.getBinding().setVariable(BR.item,item);
holder.getBinding().executePendingBindings();
高级绑定:刷新
1.立即绑定
变量或Observable改变后,会在下个帧进行绑定的改变,如果需要立即执行,可以执行executePendingBindings()
2.后台线程
Data Binding会本地化变量/值域,以避免同步问题(对collection不行)
Binding的生成
默认生成规则
下划线分割,大写开头,如contact_item.xml->ContactItemBinding
自定义class
<data class = “ContactItem”>
....
</data>