DataBinding的使用心得

这篇以前在简书写的blog,由于已经不会在简书写东西了,就搬过来这边

前言

在项目中使用到了DataBinding,深感它的优秀,于是进行分享。

什么是DataBinding

DataBinding,数据绑定,可以直接在xml中绑定数据并实现一些处理逻辑,实时动态刷新数据。它的功能强大,可以节省很多手写的代码,而且性能也很好。

DataBinding的优点和缺点

优点

上面说了它的性能很好,因为它0反射,而且性能比直接findViewById要高。可以查看DataBinding的源码:
图片.png
图片.png
还有它生成的实体类:
图片.png
一个Activity会有一个Window对象,而一个Window对象也有一个DecorView。DecorView是一个ViewGroup,布局文件都是通过inflate转化为view,加入到DecorView中,可以说DecorView是最大的根布局,而这个android.R.id.content正是它的id。DataBinding通过获取这个根布局,然后通过for循环将里面的控件一个个return出去,然后在生成的实体类再一个个获取。这样子的效率比直接findViewByid要效率的多,因为每次findViewByid都需要进行一次for循环在ViewGroup里面来寻找指定id名的控件。

缺点

目前AS对DataBinding在xml编写时还是不太友善的,代码自动补全功能做得还是有点差,这个有待Google日后的改善。

怎么使用 DataBinding

使用方法很简单,Gradle 1.5 alpha 及以上自带支持 DataBinding,仅在app模块的build.gradle中加上几行代码就可以使用了:

android {
    ...
    dataBinding {
        enabled = true
    }
    ...
}

将一个layout变成DataBinding的layout也很简单的:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

//原来的layout 代码

</layout>

当我们将layout改造完成后,DataBinding就会自动生成对应的编译文件了。假如没有,可以make project一下。
而编译文件的命名一般都是通过xml的文件名生成,如activity_main.xml,则会生成ActivityMainBinding,item_list_name则会生成ItemListNameBinding。

动态更新数据

上面有提到过的,DataBinding可以实时动态刷新数据。这是通过继承DataBinding的BaseObservable来做到的。

public class InfoBean extends BaseObservable{
       
private String unit;    
private String rental;     
private List<String> list;    

public InfoBean(String unit, String rental,List<String> list) {       
   this.unit = unit;       
   this.rental = rental;    
   this.list = list;  
}   

 @Bindable    
public String getUnit() {   
     return unit;   
 }   

 public void setUnit(String unit) {     
   this.unit = unit;        
   notifyPropertyChanged(BR.unit); 
}    

 public String getRental() {      
  return rental;   
 }    

public void setRental(String rental) { 
       this.rental = rental;   
 }   

 @Bindable    
public List<String> getList() {      
  return list;    
}   

 public void setList(List<String> list) {      
  this.list = list;        
  notifyPropertyChanged(BR.list);   
 }
}

BR.java是类似R.java的资源文件,是 Binding Resources 的缩写,由框架自动生成。
注意,BR 中的 id 生成的依据是 @Bindable 修饰的方法名 getXXX(),而非方法体的内容。当在 getXXX() 方法前加 @Bindable 之后,BR.java中会自动生成常量BR.XXX。如果觉得自动生成速度不够快,也可以试下make project一下。
DataBinding还提供了其他已经实现好的BaseObservable子类,包括 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, 和ObservableParcelable。
它们在xml中,使用方法和普通的String,int一样,只是会自动刷新,但在java中访问则会相对麻烦,因为它是通过get/set方法来进行获取和修改的。这里使用ObservableBoolean来举个例子吧:

public ObservableBoolean Show = new ObservableBoolean(true);
...
Boolean flag = Show.get();
Show.set(false);

简单的使用

1.xml的逻辑

上面有提到过,DataBinding是可以在xml里面写一些处理逻辑的。我们将一个layout文件改成DataBinding模式后,通过DataBinding的data标签,我们可以很轻松给控件绑定文本等属性和绑定点击方法的。我们来看下面这一段的xml逻辑吧:

<layout  xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools">
      <data>
            <import type="android.view.View" />

            <variable    
              name="presenter"    
              type="com.fritz.demo.DemoActivity.DemoPresenter" /
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值