(译) Data Binding 使用可观察的数据对象

栏目: Android · 发布时间: 7年前

内容简介:可观察性指的是一个对象通知其它对象它数据发生变化的能力。数据绑定库能让你使对象(objects),域(fields)、以及集合(collections)变得可观察。任何普通的对象都能用于数据绑定,但是修改对象并不会自动导致UI的更新。数据绑定可以被用来给予你的数据对象通知其他对象的能力,例如,当它的数据发生改变时的监听器。有三种不同类型的可观察类:

原文链接

可观察性指的是一个对象通知其它对象它数据发生变化的能力。数据绑定库能让你使对象(objects),域(fields)、以及集合(collections)变得可观察。

任何普通的对象都能用于数据绑定,但是修改对象并不会自动导致UI的更新。数据绑定可以被用来给予你的数据对象通知其他对象的能力,例如,当它的数据发生改变时的监听器。有三种不同类型的可观察类: objects , fields 以及 collections

当这些可观察数据对象绑定到界面,数据对象的一个属性发生变化,界面就会自动更新。

可观察的域(fields)

在创建实现 Observable 接口的类的时候是有一定工作量的,如果你的类中只有少量几个属性是得不偿失的。在这种情形下,你可以使用通用的可观察类以及以下的基础类来是域变得可观察:

ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable

可观察域是有单个域的自给自足的可观察对象。基础版本避免了访问操作的装箱和拆箱。为了使用这个机制,创建一个公开的final属性,如下例子所示:

class User {
    val firstName = ObservableField<String>()
    val lastName = ObservableField<String>()
    val age = ObservableInt()
}

为了访问域的值,使用set()和get()的存取方法,如下所示:

user.firstName = "Google"
val age = user.age

注意:在Android Studio 3.1以及更高版本上,你可以使用LiveData对象替代Observable域,它能够为你的应用带来额外的好处。想要知道跟多的信息,查看使用LiveDtat通知UI数据发生了变化。

可观察的集合

一些应用使用动态结构来持有数据。可观察的集合允许通过key来访问这些结构。 ObservableArrayMap 类在key是一个引用类型的十分有用的,例如 String ,如以下的例子所示:

ObservableArrayMap<String, Any>().apply {
    put("firstName", "Google")
    put("lastName", "Inc.")
    put("age", 17)
}

在布局中,map可用用字符串key找到,如下:

<data>
    <import type="android.databinding.ObservableMap"/>
    <variable name="user" type="ObservableMap<String, Object>"/>
</data>
…
<TextView
    android:text="@{user.lastName}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text="@{String.valueOf(1 + (Integer)user.age)}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

当key是整形的时候, ObservableArrayList 是很有用的,如下:

ObservableArrayList<Any>().apply {
    add("Google")
    add("Inc.")
    add(17)
}

在布局中,列表能够通过索引访问,如下例所示:

<data>
    <import type="android.databinding.ObservableList"/>
    <import type="com.example.my.app.Fields"/>
    <variable name="user" type="ObservableList<Object>"/>
</data>
…
<TextView
    android:text='@{user[Fields.LAST_NAME]}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

可观察的对象

实现 Observable 接口的类,允许注册当可观察对象的属性发生变化的监听器。为了使开发变得简单,DataBinding 库提供了 BaseObservable 类,它实现了监听注册机制。这个实现BaseObservable 的数据类是负责在属性改变的时候进行通知的。这是通过赋值一个Bindable 对象到 getter 以及在 setter 对象中调用 notifyProperytyChanged(),如下例所示:

class User : BaseObservable() {

    @get:Bindable
    var firstName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.firstName)
        }

    @get:Bindable
    var lastName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.lastName)
        }
}

在模块包中,Data binding 生成了一个名叫 BR 的类,这个类包含了用做数据绑定的资源id。 Bindable 注解在编译时在BR类文件中生成了一个入口。如果用于数据的基础类不能发生改变, Observable 接口可以通过使用一个 PropertyChangeRegistry 对象来有效地注册和通知监听器的方式实现。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从零开始做运营

从零开始做运营

张亮 / 中信出版社 / 2015-11-1 / 49.00元

运营是什么?怎样做运营?产品和运营是什么关系?我是否适合从事互联网运营?为什么我做的运营活动收效甚微? 在互联网大热的今天,互联网运营成为一个越来越重要的岗位,事关网站、产品的发展与存亡。很多年轻人带着对互联网的热情投身到这个行业,却发现自己对这个行业所知甚少,对互联网运营更加陌生,甚至有一些有志于从事互联网运营的人,因为对运营缺乏了解而难以确定自己的职业发展方向。本书的出发点就在于此,它将......一起来看看 《从零开始做运营》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具