您的位置:首页 > 其它

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

2017-04-14 17:25 330 查看
官网地址: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");
}


演示结果



图中发现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方法修改值

看看效果



结束

其他还有Map类型List类型的大家自己去试试吧,之后讲讲在RecycleView中的使用吧,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: