学习DataBinding的基础用法
了解DataBinding的原理
掌握高级的DataBinding使用
前置知识
Activity/Fragment/Android UI基础
RecyclerView
提高开发效率
性能高/功能强
基本用途
去掉Activities&Fragments内的UI代码
XML变成UI的唯一真实来源
减少定义view id的主要用途(不再需要findViewById cached)
类似方案
ButterKnife
Android Annotations 侵入醒太强
RoboBinding
主要优势
1.去掉Activity&Fragment内的UI代码
2.性能超过手写代码,安全(不会id错而crash)
3.保证执行在主线程
主要劣势
IDE支持不那么完善
报错信息不那么直接
没有重构支持
如何启用DataBinding
使用-Gradle
App Module-build.gradle
Android{
dataBinding{enabled=true}
}
基础用法
Layout文件改写
在原layout文件外套一层标签
//原来的布局xml
去除findViewById
不再写findViewById
binding.xxx
名字统一转换成驼峰命名
生成规则
UI/事件绑定
Bind UI
setVariable、setXXX
事件
android:nClick
android:onLongClick
android:onTextChanged
…
实现方法
1.方法引用
2.监听器绑定@{()->obj.func(params)}
Android.binding
BR
XxxBinding
DataBinding基本原理
开始编译->处理layout文件->解析表达式->java编译->依赖解析->找到set函数
主要性能(1)
1.0反射
2.findViewById需要遍历整个viewgroup,现在只需要做一次
3.使用位标记检查是否需要更新
主要性能(2)
数据改变在下一次批量更新才会触发操作
缓存表达式,如:
a?(b?c:d):e
f?(b?c:d):f
二元&|^
一元±!~
位移>> >>> <<
比较== > < >= <=
instatnceof
Grouping
文字-character,String,numeric,null
Cast
方法调用
Field访问
Array访问[]
三元运算符
表达式-缺省(不支持的用法)
this
super
new
显示泛型调用
表达式-空合并运算符
取非空表达式
android:text=“@{user.displayName??user.lastName}”
等同于三元运算符?value:value
表达式-例子
Margin @dimen+@dimen
android:text=“@{String.valueOf(index+1)}”
visibility=“@{age <13?View.GONE:View.VISIBILE}”
transitionName=‘@{“image_”+id}’
表达式-最佳实践
结合ViewModel使用
保持表达式简洁直观
避免空指针
自动空指针检查
{user.name}->null
{user.age}->0
数组越界(ddtabinding没有办法处理,需要自己在代码里处理)
bind:
注意:尚不支持direct child,如root为merge(没有viewgroup包裹的view)
viewstub
ViewStub proxy final field
ViewStubProxy
OnInflateListener
BaseObservable
notifyPropertyChange
@Bindable
Observable Fields
ObservableBoolean,ObservableByte,ObservableChar…ObservableParcelable
Observable Collection
ObservableArrayMap,ObservableArrayList
RecyclerView
onBindViewHolder
final T item=mItems.get(position);
Holder.getBinding().setVariable(BR.item,item);
Holder.getBinding().executePendingBindings();
立即绑定
变量活着Observable改变厚,会在下个帧进行绑定的改变,如果需要立即执行,可以执行executePendingBindings()
后台线程
Databinding会本地化变量/值域,以避免同步问题(对collection不行)
默认生成规则
下划线分割,大写开头如contact_item.xml->ContactItemBinding
自定义class
…
< 的转义符 <
学习资料视频链接