Data Binding

本文介绍Android Data Binding的基本概念及使用方法,包括其在Activity和Fragment中的应用、与ButterKnife等工具的区别,以及如何通过Gradle配置启用Data Binding等功能。

Android Data Binding

入门篇 —MVVM 提高开发效率 性能高/功能强

  1. 用途
    1) 去掉Activity和Fragments内的UI代码
    2) XML变成UI的唯一真实来源
    3) 减少定义view id的主要用途(不再需要findViewById)

  2. 类似方法
    ButterKnife/Android Annotations/RoboBinding

  3. 优势劣势
    优势
    1) 去除Activity/Fragment中的UI代码
    2) 性能查过手写代码,安全(不会id错而crash)
    3) 保证执行在主线程
    劣势
    1) IDE支持不那么完善
    2) 报错不那么直接
    3) 没有重构支持

  4. 使用-Gradle
    1) 在App module - build.gradle中

android{
        dataBinding{
            enabled=true
        }
    }
  1. 基础使用
    1) layout文件改写
    在原layout文件外套一层标签

    2) 去除findViewById
    3) 事件绑定

  2. 主要性能
    1) 0反射
    2) findViewById需要遍历整个viewgroup,现在只需做一次
    3) 使用位标记来检验更新
    4) 数据改变在下次批量更新时才会触发操作
    5) 缓存表达式

  3. 表达式
    1) 二元
    2) 一元
    3) 移位
    4) 比较
    5) Instanceof
    6) grouping
    7) 文字
    8) Cast
    9) 方法调用
    10) Filed访问
    11) Array数组
    12) 三目运算符
    13) 取非空表达式

  4. 缺省
    1) this
    2) super
    3) new
    4) 显示泛型调用

  5. 避免空指针
    1) 自动空指针检测
    2) 数组越界无法检测

  6. include
    1) bind:
    2) 尚不支持direct child, 如root为merge

  7. viewstub
    ViewStub proxy final field
    ViewStubProxy
    OnInflateListener

  8. Observable
    1) BaseObservable
    notifyPropertyChange@Bindable
    2) Observable Fields
    ObservableBoolean, ObservableByte,ObservableChar…ObservableParcelable
    3) Observable Collection
    ObservableArrayMap, ObservableArrayList

  9. 高级绑定: 动态变量
    1) RecyclerView
    2)

    final T item = mItems.get(position);
    holder.getBinding().setVariable(BR.item, item);
    holder.getBinding().executePendingBindings();
  1. 刷新
    1) 立即绑定
    变量或Observable改变后,会在下个帧进行绑定的改变,如果需要立即执行,可以执行executePendingBindings()
    2)后天线程
    data binding会本地化变量/值域,以避免同步问题(对collection不行)

高级篇

  1. List使用Data Binding
    1). RecyclerView:
    I. 更高级、灵活的ListView
    II. 替代ListView、GridView、瀑布流
    III. Holder
    2). Generic Binding
    可复用ViewHolder

  2. 自定义属性
    1) Setter: 自动寻找set方法

    <LinearLayout
            app:scrimColor="@{@color/scrimColor}"
        />
2) BindingMethods: Binding类型
    @Binding
    Methods({
            @BindingMethod(
                type = "android.widget.ImageView"
                attribute = "android:tint"
                method = "setIamgeTintList"
            )
        })
    android:tine -> setImageTintList
3) BindingApater
        @BingdingApdater("bind:imageUri")
        public static void loadImageFromUri(ImageView view, Uri uri){
            ... // load
        }
4) 多属性适配,只需在上一条中括号中添加相同的一条即可
5) BingdingConversion
    @BindingConversion
    public static ColorDrawable convertColorToDrawable(int color){
        return new ColorDrawable(color);
    }
  1. 双向绑定
    1) 老方式
    Listener———-
    <EditText 
        android:text="@{user.name}"
        android:afterTextChanged="@{callback.change}"/>
        public void change(Editable s){
            final String text = s.toString();
            if(!text.equals(name.get())){
                name.set(text);
            }
        }
2) 现在: 使用 @=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值