美文网首页Databinding
Android DataBinding (三) Observab

Android DataBinding (三) Observab

作者: teletian | 来源:发表于2017-07-15 23:25 被阅读309次

    Android DataBinding (一) 基本用法
    Android DataBinding (二) 事件处理
    Android DataBinding (三) Observable (本文)
    Android DataBinding (四) 自定义属性
    Android DataBinding (五) 自定义 View 的双向绑定
    Android DataBinding (六) EditText 绑定 TextChangedListener 和 FocusChangeListener

    BaseObservable

    ViewModel 的值变化之后,如果需要画面做相应的刷新,那么可以继承 BaseObservable。

    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);
       }
    }
    

    在 set 方法里面,使用 notifyPropertyChanged 来通知 UI 刷新,notifyPropertyChanged 只会刷新具体的值,notifyChange 方法则会刷新所有的值。
    BR 的域则是通过在 get 方法上加 @Bindable 生成的。

    Observable Fields

    继承自 BaseObservable 的方法有点复杂,DataBinding 还提供了一种简单的写法----ObservableField。

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

    直接把属性定义成 ObservableField 类型的,并且修饰符需要是 public final 的。
    除了 ObservableField,还可以使用 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable。
    访问值得时候,可以使用 get set 方法。

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

    Observable Collections

    如果使用 Map,List 等保存数据。DataBinding 也提供了 ObservableArrayMap,ObservableArrayList。

    ObservableArrayMap

    ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
    user.put("firstName", "Google");
    user.put("lastName", "Inc.");
    user.put("age", 17);
    
    <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"/>
    

    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"/>
    
    

    相关文章

      网友评论

        本文标题:Android DataBinding (三) Observab

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