Android实战积累——DataBinding使用技巧总结(二)

一、BaseObservable

  前面通过一个例子简单描述了DataBinding的使用,就上个例子而言存在一个问题。单一的赋值在实际开发中没有任何意义,要实现数据源改变是UI中的显示数据也得发生改变那该怎么做,ListView的数据是通过Adapter提供的,当数据发生改变时,我们通过notifyDatasetChanged通过UI去改变数据,这里面的原理其实就是内容观察者,庆幸的是DataBinding也支持内容观察者,而且使用起来也相当方便!

  我们可以通过Observable的方式去通知UI数据已经改变了,当然了,官方为我们提供了更加简便的方式BaseObservable,我们的实体类只需要继承该类,稍做几个操作,就能轻松实现数据变化的通知。如何使用呢? 首先我们的实体类要继承BaseObservale类,第二步在Getter上使用注解@Bindable,第三步,在Setter里调用方法notifyPropertyChanged,第四步,完成。

二、案例

  1、首先定义一个实体类StudentBO,并继承BaseObservable

  

package hlf.com.myapplication;

import android.databinding.BaseObservable;
import android.databinding.Bindable;

/**
 * Created by Administrator on 2016/4/3.
 */
public class StudentBO extends BaseObservable {
    private String name;

    public StudentBO(String name) {
        this.name = name;
    }

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

    public void setName(String name) {
        this.name = name;
        //hlf.com.myapplication.BR.name类似于R.java,保存了我们所有变量的引用地址,这里我们使用了name
        notifyPropertyChanged(hlf.com.myapplication.BR.name);
    }
}

  2、布局文件

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data class=".Custom"> //自定义DataBindingUtils.setContentView返回的binding类型的类型
        <import type="hlf.com.myapplication.StudentBO" />
        <variable
            name="stu"
            type="StudentBO"/>
        <variable
            name="click"
            type="hlf.com.myapplication.MainActivity" />
    </data>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="@{click.click}"
        android:text="@{stu.name}"/>
</layout> 

  3、Activity

package hlf.com.myapplication;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
/**
 * Created by Administrator on 2016/4/3.
 */
public class MainActivity extends AppCompatActivity {
    private StudentBO mStu;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //类型为布局文件中声明的class=".Custom"
        hlf.com.myapplication.Custom binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        mStu = new StudentBO("11111");
        binding.setStu(mStu);
        //注册监听事件
        binding.setClick(this);
    }
    //重新设定view中的值
    public void click(View view) {
        mStu.setName("2222");
    }
}

  发布、、、点击TextView就可以实现事件监听数据源是否改变从而改变UI显示数据

 

posted on 2016-04-03 19:44  Huang路飞  阅读(190)  评论(0)    收藏  举报

导航