DataBinding基础篇

Android DataBinding课程介绍

学习DataBinding的基础用法
了解DataBinding的原理
掌握高级的DataBinding使用

前置知识
Activity/Fragment/Android UI基础
RecyclerView

基本概念
MVVM
在这里插入图片描述

提高开发效率
性能高/功能强

什么是DataBinding

基本用途
去掉Activities&Fragments内的UI代码
XML变成UI的唯一真实来源
减少定义view id的主要用途(不再需要findViewById cached)

类似方案
ButterKnife
Android Annotations 侵入醒太强
RoboBinding

主要优势
1.去掉Activity&Fragment内的UI代码
2.性能超过手写代码,安全(不会id错而crash)
3.保证执行在主线程

主要劣势
IDE支持不那么完善
报错信息不那么直接
没有重构支持

DataBinding基础用法

如何启用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)}

DataBinding 原理

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使用
保持表达式简洁直观

null检查

避免空指针

自动空指针检查
{user.name}->null
{user.age}->0

数组越界(ddtabinding没有办法处理,需要自己在代码里处理)

include

bind:

注意:尚不支持direct child,如root为merge(没有viewgroup包裹的view)

viewstub

ViewStub proxy final field
ViewStubProxy
OnInflateListener

Observable(数据)

BaseObservable
notifyPropertyChange
@Bindable

Observable Fields
ObservableBoolean,ObservableByte,ObservableChar…ObservableParcelable

Observable Collection
ObservableArrayMap,ObservableArrayList

DataBiding高级绑定

高级绑定:动态变量

RecyclerView

onBindViewHolder

final T item=mItems.get(position);
Holder.getBinding().setVariable(BR.item,item);
Holder.getBinding().executePendingBindings();

高级绑定:刷新

立即绑定
变量活着Observable改变厚,会在下个帧进行绑定的改变,如果需要立即执行,可以执行executePendingBindings()

后台线程
Databinding会本地化变量/值域,以避免同步问题(对collection不行)

Binding生成

默认生成规则
下划线分割,大写开头如contact_item.xml->ContactItemBinding

自定义class


常见问题

< 的转义符 &lt;

学习资料视频链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值