DataBinding 学习系列(3)新增的可见字段来编写对象(bean)

前言#

之前主要都是在讲DataBinding在xml中的使用,基本上满足了大部分的需求了,但是不能放下前进的脚步,了解和使用DataBinding中的可见字段,绝对是一件锦上添花的事情。

实战#

首先来看一下之前的User代码

/**
 * Created by li.zhipeng on 2017/2/10.
 *
 *      测试用的User类
 */

public class User {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

非常简单的User类,只有一个name属性。如果有一种情况,如果User的name在设置了之后,又发生了变化,我需要更新显示的name的View,怎么办?

这样的代码已经达不到我们需要的效果,所以我要借助DataBinding中的BaseObservable接口。

/**
 * Created by li.zhipeng on 2017/2/10.
 *
 *      测试用的User类
 */

public class User extends BaseObservable {

    @Bindable
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
//        notifyChange();
    }
}

从上面的代码看出,集成了BaseObservable接口之后,出现了三个新的方法:

notifyChange() :对象已经发生改变,所有绑定过该对象的view都需要刷新。

notifyPropertyChanged(BR.name) : 对象的某一个属性发生了改变,通过使用了这个属性的view进行更新。

@Bindable : 把某一个对象的属性绑定到BR文件中,代码中对name进行了绑定,所以在BR中就出现了BR.name, 来直接找到这个属性。

这样就已经达到了我们想要的效果,其实DataBingding除了提供了可见接口来帮助我们实现这种效果,还提供了可见字段:

ObservableBoolean, ObservableByte, ObservableChar 等基本数据类型,还包括对象类型ObservableField<T>等。

可见字段是独立字段的可见对象,原始版本在访问操作中避免装箱和拆箱,为方便使用,在数据类创建中使用 pulic final。

下面来再次修改User的代码:

/**
 * Created by li.zhipeng on 2017/2/10.
 *
 *      测试用的User类
 */

public class User{

    public final ObservableField<String> name = new ObservableField<>();

}

非常的简洁,看上去应该是对String进行了一次包装,使用起来非常简便。

可见集合#

在提供了基本字段以外,还提供了可见集合:

ObservableArrayMap和ObservableArrayList。

使用方法

ObservableArrayMap<String, Object> userMap = new ObservableArrayMap<>();
userMap.put("firstName", "Google");
userMap.put("lastName", "Inc.");
userMap.put("age", 17);

<data>
    <import type="android.databinding.ObservableMap"/>
    <import type="com.example.my.app.Fields"/>
    <variable name="user" type="ObservableMap<String, Object>"/>
</data>
…
<TextView
   android:text='@{user[Fields.LAST_NAME]}'
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>
<TextView
   android:text='@{String.valueOf(1 + (Integer)user["age"])}'
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

ObservableArrayList<Object> userList = new ObservableArrayList<>();
userList.add("Google");
userList.add("Inc.");
userList.add(17);

<data>
    <import type="android.databinding.ObservableList"/>
    <variable name="user" type="ObservableList<Object>"/>
</data>
…
<TextView
   android:text='@{user[0]}'
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>
<TextView
   android:text='@{String.valueOf(1 + (Integer)user[2])}'
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

我们队上面的使用进行一下总结:

1、在java代码中,没有变化,使用方法和普通的HashMap、ArrayList没有区别。

2、在xml中,ObservableArrayMap可以根据索引key来获取集合中的对象,ObservableList可以通过坐标来获取对象。

3、手动引入了Field类,所以能够在xml中使用Field中的静态成员变量LAST_NAME,默认引入了java.lang.*,所以能够直接使用String的静态方法。

4、可以在xml进行强制转换。

总结#

DataBinding中的可见接口和字段,我们都已经掌握的差不多了,使用DataBinding将会更加轻松, 代码可会更加简洁,下一篇就讲一下DataBinding的高级用法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,126评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,806评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,168评论 19 139
  • 熊小懒阅读 262评论 0 0
  • 西风烈,北风紧,裹紧的棉袄依然钻进了冷风,在这个乍冷的冬季,我突然意识到冬来了,时光走了,有些东西也跟着走远了。 ...
    嫣容浅笑阅读 295评论 0 3