DataBinding使用(二):可观察的数据对象

DataBinding使用(一):布局和binding表达式
DataBinding使用(二):可观察的数据对象
DataBinding使用(三):DataBinding高级使用DataBinding中可观察的对象的作用是当数据发生变化是通知其它对象,和观察者模式差不多。Databinding 提供了三种通知方式来通过JavaBean更新UI,分别是Observable对象,ObservableFilelds字段和Observable Cllections集合,这些数据对象绑定到UI,当数据对象的属性发生变化时,UI也自动更新。

一、JavaBean 继承BaseObservable
public class UserBean extends BaseObservable {
    private String name;
    private String skill;

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

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

    @Bindable
    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
        notifyPropertyChanged(BR.skill);

    }

}

继承BeanObservable,getter方法添加@Bindable注解,setter方法内部添加通知notifyPropertyChanged

绑定布局

<?xml version="1.0" encoding="utf-8"?>
<layout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable name="user" type="com.test.databinding.two.data.UserBean"/>
    </data>
    <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".two.ObservableActivity">
        <TextView

                android:id="@+id/tv_name_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.name}"
                android:textSize="30sp"
                app:layout_constraintRight_toLeftOf="@+id/tv_skill_1"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

        <TextView
                android:id="@+id/tv_skill_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.skill}"
                android:textSize="30sp"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/tv_name_1"
                app:layout_constraintTop_toTopOf="parent"/>
        <Button android:layout_width="wrap_content"
                android:id="@+id/bt_change_1"
                android:layout_height="wrap_content"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                android:text="BaseObservable更改数据"
                app:layout_constraintTop_toBottomOf="@+id/tv_name_1"
        />
    </android.support.constraint.ConstraintLayout>
</layout>
class ObservableActivity : AppCompatActivity() {

    private lateinit var activityObservableBinding: ActivityObservableBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activityObservableBinding = DataBindingUtil.setContentView(this, R.layout.activity_observable)
        var user = UserBean()

        user.name = "郭靖"
        user.skill = "一箭双雕"
        activityObservableBinding.user = user

        bt_change.onClick {
            if (user.name.equals("郭靖")){
                user.name="黄蓉"
                user.skill="奇门遁甲"
            }else{
                user.name = "郭靖"
                user.skill = "一箭双雕"
            }            
        }
    }
}

在这里插入图片描述

二、可观察的字段
  • ObservableField
  • ObservableBoolean
  • ObservableByte
  • ObservableChar
  • ObservableShort
  • ObservableInt
  • ObservableLong
  • ObservableFloat
  • ObservableDouble
  • ObservableParcelable

创建可观察字段

class UserModel {
    var name = ObservableField<String>()
    var skill = ObservableField<String>()
}

绑定布局

data>
        <variable name="model" type="com.test.databinding.two.data.UserModel"/>
    </data>
    ...
 <TextView
               android:id="@+id/tv_name_2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{model.name}"
                android:textSize="30sp"
                app:layout_constraintTop_toBottomOf="@+id/bt_change_1"
                app:layout_constraintRight_toLeftOf="@+id/tv_skill_2"
                app:layout_constraintLeft_toLeftOf="parent"
               />

        <TextView
                android:id="@+id/tv_skill_2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{model.skill}"
                android:textSize="30sp"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/tv_name_2"
                app:layout_constraintTop_toBottomOf="@+id/bt_change_1"
                />
        <Button android:layout_width="wrap_content"
                android:id="@+id/bt_change_2"
                android:layout_height="wrap_content"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                android:text="ObservableField更改数据"
                app:layout_constraintTop_toBottomOf="@+id/tv_name_2"
        /> 
 var model= UserModel()
        model.name.set("东邪")
        model.skill.set("碧海潮生")

        activityObservableBinding.model=model

        bt_change_2.onClick {
            if (model.name.get().equals("东邪")){
                model.name.set("西毒")
                model.skill.set("蛤蟆功")
            }else{
                model.name.set("东邪")
                model.skill.set("碧海潮生")
            }
        }

在这里插入图片描述

三、可观察的集合

使用动态的数据结构更新UI,不需要创建JavaBean,DataBinding 提供了ObservableArrayListObservableArrayMap 两个类的实现
使用方式和ArrayList、HashMap一样,这里以ObservableArrayList为例

data>  
   <variable name="list" type="android.databinding.ObservableArrayList&lt;Object&gt;"/>
    </data>
    ...
 <TextView
                android:id="@+id/tv_name_3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{list[0]}"
                android:textSize="30sp"
                app:layout_constraintTop_toBottomOf="@+id/bt_change_2"
                app:layout_constraintRight_toLeftOf="@+id/tv_skill_3"
                app:layout_constraintLeft_toLeftOf="parent"
        />

        <TextView
                android:id="@+id/tv_skill_3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{list[1]}"
                android:textSize="30sp"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/tv_name_3"
                app:layout_constraintTop_toBottomOf="@+id/bt_change_2"
        />
        <Button android:layout_width="wrap_content"
                android:id="@+id/bt_change_3"
                android:layout_height="wrap_content"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                android:text="ObservableArray更改数据"
                app:layout_constraintTop_toBottomOf="@+id/tv_name_3"
        />
        val observableList = ObservableArrayList<Any>()

        observableList.add("南帝")
        observableList.add("一阳指")
        activityObservableBinding.list = observableList

        bt_change_3.onClick {
            if (observableList[0].equals("南帝")) {
                observableList.clear()
                observableList.add("北丐")
                observableList.add("打狗棒")
            } else {
                observableList.clear()
                observableList.add("南帝")
                observableList.add("一阳指")
            }
        }

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值