美文网首页
框架组件(二)Data Binding 3-结合Observer

框架组件(二)Data Binding 3-结合Observer

作者: HelloBird_ | 来源:发表于2018-11-23 10:59 被阅读0次

    该系列文章是对Android推出的架构组件相关文章,按作者自己理解来翻译的,同时标记有作者自己一些简单笔记。如果读者发现文中有翻译不准确的地方,或者理解错误的地方,请不吝指教。

    源自Google官方
    Data Binding Library
    一文的翻译与归纳

    其他相关链接:
    Android Jetpack Components

    [TOC]

    可观测性是指一个对象能够在数据改变时通知其它对象。Data Binding 库允许你使用可观测的对象、字段或集合。

    Data Binding库可以使用任何普通的对象,但是改变这些对象时不会自动触发UI更新。Data Binding 可以为你的数据对象提供数据改变时通知其他对象的能力,这里有三种不同的可观测类类型:对象、字段和集合。

    当UI绑定了可观测数据对象并且数据对象的一个属性发生改变时,UI会自动刷新。

    Observable fields(可观测字段)

    要实现 Observable 接口会有一些工作量,如果你的类只有几个属性,那么这些工作是不值得的。基于这点,你可以使用通用的 Observable 类和以下特定的类让字段可观测。

    可观测字段是包含单个字段的可观测对象。原始版本在访问操作时避免装箱和拆箱操作。要使用此机制,需要在Java代码中创建公用的final属性,或在Kotlin中创建只读属性。如下代码所示:

    private static class User {
        public final ObservableField<String> firstName = new ObservableField<>();
        public final ObservableField<String> lastName = new ObservableField<>();
        public final ObservableInt age = new ObservableInt();
    }
    

    使用 set()get() 方法访问字段的值,如下:

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

    注意:Android Studio 3.1 或以上版本可以使用 LiveData 对象来替代可观测对象,这种做法更有益于你的应用。

    Observable collections(可观测集合)

    一些应用使用动态结构来保存数据,可观测集合可以使用 key 来访问这些结构。当 key 是引用类型时,比如 StringObservableArrayMap 类是很好的选择,如下所示:

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

    在布局中,可以通过 key 获取 map 中的值,如下:

    <data>
        <import type="android.databinding.ObservableMap"/>
        <variable name="user" type="ObservableMap<String, Object>"/>
    </data>
    …
    <TextView
        android:text="@{user.lastName}"
        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"/>
    

    当 key 是 int 类型时,可以选择 ObservableArrayList,如下:

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

    再布局中可以通过下表来访问列表中的数据,如下:

    <data>
        <import type="android.databinding.ObservableList"/>
        <import type="com.example.my.app.Fields"/>
        <variable name="user" type="ObservableList<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[Fields.AGE])}'
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    

    Observable objects(可观测对象)

    一个实现了 Observable 接口的类,允许注册监听可观测对象的数据改变。

    Observable 接口有添加和移除监听的机制,但是你必须决定什么时候发送通知。为了让开发更容易,DataBinding 库提供了 BaseObservable 类,它已经实现了监听器注册机制。继承自 BaseObservable 的数据类主要负责属性改变时进行通知。为 getter 方法添加 @Bindable 并在 setter 中调用 ntifyPropertyChanged() 通知属性改变,如下所示:

    private static class User extends BaseObservable {
        private String firstName;
        private String lastName;
    
        @Bindable
        public String getFirstName() {
            return this.firstName;
        }
    
        @Bindable
        public String getLastName() {
            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);
        }
    }
    

    DataBinding 会为 module 中使用了数据绑定的 ID 和资源生成 BR 类。编译时在 BR 类中生成 Bindable 注解的条目。如果无法修改数据类的基类,可以使用 PropertyChangeRegistry 对象来实现 Observable 接口,以实现注册和通知监听器。

    相关文章

      网友评论

          本文标题:框架组件(二)Data Binding 3-结合Observer

          本文链接:https://www.haomeiwen.com/subject/ufadqqtx.html