Data binding的使用(三)----监听数据的变化

官网地址:Google Android Data Binding Library

Demo地址:(https://github.com/zhangiqlin/DataBindingDemo)

上一篇文章 Data binding的使用二讲了Data binding监听事件绑定的操作。

如何根据绑定值的变化在UI中同步显示

这里有2种操作方式,一种是Observable Objects,观察对象的变化,一种是ObservableFields,Observable Collections观察数据对象字段的变化。

Observable Objects

新建类

public class User2 extends BaseObservable
{
    private String name;



    @Bindable
    public String getName() {
        return name;
    }

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

这里我们继承了BaseObservable类,然后在getName前面加上注解@Bindable 在setName方法中使用notifyPropertyChanged(BR.name) 通知改变名称的改变。

在xml中这样配置

 <variable
            name="user2"
            type="simple.qilin.com.databindingdemo.bean.User2"></variable>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="user"
            type="simple.qilin.com.databindingdemo.bean.User"></variable>

      <!-- 省略部分代码 节约篇幅--></variable>
    </data>

    <!-- 省略部分代码 节约篇幅-->

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorAccent"
            ></View>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="12dp"
            android:text="@{user2.name}"
            />

        <Button
            android:id="@+id/updataName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{()->mainPrecenter.setNewName(user2)}"
            android:text="修改Name"
            />
    </LinearLayout>
</layout>

这里在xml中我们使用mainPrecenter.setNewName(user2)去修改上面的TextView的名称

然后在MainActivity中设置User2这个对象,

public class MainActivity extends AppCompatActivity {
    private final static String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        User user = new User("My Name is X");
        activityMainBinding.setUser(user);
        User2 user2=new User2();
        user2.setName("My name is KangKang");
        activityMainBinding.setUser2(user2);
        activityMainBinding.setMainPrecenter(new MainActivityPresenter(this));
    }
}

presenter中新增代码如下

 public void setNewName(User2 user) {
        user.setName("My Name is Jack");
    }

演示结果
avatar

扫描二维码关注公众号,回复: 1554106 查看本文章

图中发现Button的Text我们设置的明明是 修改Name 最后却都是大写的NAME 是怎么回事呢,详见(http://blog.csdn.net/cekiasoo/article/details/53718300)

第二种 ObservableFields

A little work is involved in creating Observable classes, so developers who want to save time or have few properties may use ObservableField and its siblings ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, and ObservableParcelable. ObservableFields are self-contained observable objects that have a single field. The primitive versions avoid boxing and unboxing during access operations

使用的ObservableField 可以有 ObservableBoolean ,ObservableByte,ObservableChar等等,还可以这样使用ObservableField$gtString<String>
写个例子
新增user3

public class User3 {
    ObservableField<String> userName = new ObservableField<>();

    public ObservableField<String> getUserName() {
        return userName;
    }

    public void setUserName(ObservableField<String> userName) {
        this.userName = userName;
    }
}

修改xml


 <variable
            name="user3"
            type="simple.qilin.com.databindingdemo.bean.User3"></variable>
   <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="12dp"
            android:text="@{user3.userName}"
            />
   <Button
            android:id="@+id/updataName3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{()->mainPrecenter.setUserName3(user3)}"
            android:text="User3修改"
            android:textAllCaps="false"
            />

presenter中setUserName3的处理

 public void setUserName3(User3 user) {
        user.getUserName().set("My Name is 张三");
    }

直接通过set方法修改值

看看效果

avatar

结束

其他还有Map类型List类型的大家自己去试试吧,之后讲讲在RecycleView中的使用吧,

猜你喜欢

转载自blog.csdn.net/xiaxiayige/article/details/70174517