1. 程式人生 > >android -------- Data Binding的使用(三)Observable

android -------- Data Binding的使用(三)Observable

float ech ext hhhh 方法 height wid bind ati

解決:databinding 中 ViewModel數據發生改變,View中也要改變(實時更新)

BaseObservable

在ViewModel 中可以繼承 BaseObservable

public class User extends BaseObservable {

    public User(String frstName,String lastName){
        this.frstName = frstName;
        this.lastName = lastName;
        observableArrayMap.put("zq","zhhhhh");
        list.add(
"aaa"); list.add("bbb"); } private String frstName; private String lastName; public ObservableArrayMap<String,String> observableArrayMap = new ObservableArrayMap<>(); public ObservableArrayList<String> list = new ObservableArrayList<>(); @Bindable
public String getFrstName() { return frstName; } public void setFrstName(String frstName) { this.frstName = frstName; //刷新UI notifyPropertyChanged(com.zhangqie.databinding.BR.frstName); } @Bindable public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; //全部刷新 //notifyChange(); } }

在 set 方法裏面,使用 notifyPropertyChanged 來通知 UI 刷新,notifyPropertyChanged 只會刷新具體的值,notifyChange 方法則會刷新所有的值。
BR 的域則是通過在 get 方法上加 @Bindable 生成的。

ObservableArrayMap

與Java的Map使用相同

public ObservableArrayMap<String,String> observableArrayMap = new ObservableArrayMap<>();

observableArrayMap.put(
"zq","zhhhhh");

布局中:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="user"
            type="com.zhangqie.databinding.demo2.User" />

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=‘@{user.observableArrayMap["zq"]}‘ />

    </LinearLayout>

</layout>

ObservableArrayList

與Java的List使用相同

 public ObservableArrayList<String> list = new ObservableArrayList<>();
 list.add("aaa");
 list.add("bbb");

布局中:

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=‘@{user.list[0]}‘ />


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.list[1]}" />

Observable Fields

繼承自 BaseObservable 的方法有點復雜,DataBinding 還提供了一種簡單的寫法—-ObservableField來實現數據實時刷新

public class UserObservableBean {
    public ObservableInt userId = new ObservableInt();
    public ObservableField<String> userName = new ObservableField<>();
    public ObservableDouble userAge = new ObservableDouble();
    public ObservableFloat userSex = new ObservableFloat();
}

直接把屬性定義成 ObservableField 類型的,並且修飾符需要是 public final 的。
除了 ObservableField,還可以使用 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable。
訪問值得時候,可以使用 get set 方法。

UserObservableBean userBean = new UserObservableBean();
userBean.userId.set(8);
userBean.userName.set("切切心語");
userBean.userAge.set(25);

userBean.userId.get();
userBean.userName.get(); userBean.userAge.get();
 

這種方式就方便多了;

android -------- Data Binding的使用(三)Observable