本文接《Android中的Data Binding初探 (二)》

MVVM中的Model

我们可以用任何POJO作为data binding的Model,但是直接修改POJO对象,不能直接更新UI。
Android的Data Binding模块给提供了通知机制,有3种类型,分别对应于类(Observable),字段(ObservableField),集合类型(Observable Collections)。
把这些observable对象绑定到View后,当observable对象更新后,UI会自动更新。

Observable Objects用法

我们需要把POJO继承自BaseObservable,才能获得通知UI的能力

javaprivate static class User extends BaseObservable {   private String firstName;   private String lastName;   @Bindable   public String getFirstName() {       return this.firstName;   }   @Bindable   public String getFirstName() {       return this.lastName;   }   public void setFirstName(String firstName) {       this.firstName = firstName;       notifyPropertyChanged(BR.firstName);   }   public void setLastName(String lastName) {       this.lastName = lastName;       notifyPropertyChanged(BR.lastName);   }}

Bindable标签在编译时会自动生成BR类,但Model中的数据发生改变时,
我们在Set方法中调用notifyPropertyChanged通知UI更新。

ObservableFields用法

创建支持Observable的POJO类还是有点麻烦,
ObservableFields可以简化我们的POJO对象:

javaprivate static class User extends BaseObservable {   public final ObservableField firstName =       new ObservableField<>();   public final ObservableField lastName =       new ObservableField<>();   public final ObservableInt age = new ObservableInt();}

通过以下方式访问和修改字段值

javauser.firstName.set("Google");int age = user.age.get();

对应基础数据类型有ObservableInt、ObservableFloat、ObservableBoolean等可以使用。

Observable Collections用法

DataBinding中提供了一些支持通知机制的集合类型,比如ObservableArrayList,ObservableArrayMap。

ObservableArrayMap的使用跟Map一样

javaObservableArrayMap user = new ObservableArrayMap<>();user.put("firstName", "Google");user.put("lastName", "Inc.");user.put("age", 17);

在Layout中使用ObservableArrayMap中的数据

xml        

MVVM中的ViewModel

Android中的ViewModel是自动生成的Binding类(继承自android.databinding.ViewDataBinding)

创建Binding对象

我们一般使用Binding对象的静态方法创建Binding对象:

javaMyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);MyLayoutBinding binding = MyLayoutBinding.inflate(LayoutInflater, viewGroup, false);

有时候我们需要使用DataBindingUtil创建Binding对象

javaViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater, layoutId,    parent, attachToParent);ViewDataBinding binding = DataBindingUtil.bindTo(viewRoot, layoutId);

设置View的id

使用DataBinding以后,我们一般不需要设置View的id,但是我们有时候也会需要,
设置id后,ViewDataBinding类会自动生成对应的字段,比如:

xml                                 

对应的id会自动生成:

javapublic final TextView firstName;public final TextView lastName;

Variables

在Layout中data区域定义的变量,或自动在Binding类中生成get/set方法

xml                

生成的方法如下:

javapublic abstract com.example.User getUser();public abstract void setUser(com.example.User user);public abstract Drawable getImage();public abstract void setImage(Drawable image);public abstract String getNote();public abstract void setNote(String note);

Dynamic Variables

有时候,我们无法知道确切的binding类,比如RecyclerView Adapter可以使用任意的layout,
所以我们的binding类需要动态生成。
我们需要在onBindViewHolder方法中给变量赋值,比如我们的layout中声明了一个item变量,
我们通过BindingHolder的getBinding返回一个binding对象,调用setVariable方法给item变量赋值

javapublic void onBindViewHolder(BindingHolder holder, int position) {   final T item = mItems.get(position);   holder.getBinding().setVariable(BR.item, item);   holder.getBinding().executePendingBindings();}

binding对象需要在onCreateViewHolder中创建

javaViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()),                                                    R.layout.list_item,viewGroup,false);BindingHolder holder = new BindingHolder(binding.getRoot());holder.setBinding(binding);

本文参考谷歌官方的Data Binding Guide

本文作者: 阳春面
原文地址:http://www.aswifter.com/2015/07/09/android-data-binding-3/

欢迎关注我的微信公众号,分享Android 开发,IOS开发,Swift开发和互联网内容
微信号:APP开发者

更多相关文章

  1. 类和 Json对象
  2. Android绘图基础
  3. android在window下的开发环境搭建
  4. Android开发之文件下载
  5. 如何设置Android命令行环境变量
  6. android上的http
  7. android中AVD的使用
  8. Android中Activity、Window、PhoneWindow和DecorView之间的关系
  9. Android防止内容溢出

随机推荐

  1. 通过app打包修改app名称
  2. Maven Android(安卓)Plugin
  3. Android(安卓)头像上传
  4. android引用外部工程或jar包
  5. Android(安卓)原生项目集成 Flutter
  6. Android样式和主题(style&theme)
  7. 获取 + 查看 Android(安卓)源码的 方法
  8. Android(安卓)5.0 默认水波纹背景属性,可
  9. android颜色代码
  10. 【Android】:跳转系统界面汇总