以前写了Android数据绑定DataBinding(一)入门篇,很简单的记录了如何使用DataBinding,其初衷是想要代码中的数据发生改变,不须要繁琐的setText等操做,在最后说到了只须要将POJO继承一个BaseObservable便可,其实这只是冰山一角啦!!!android
本文如有出入,请指正——来自小渣渣的颤抖
客官可移步小站查看本文http://fanjiajia.cn/2019/07/07/Android/flx1/
本文接着上一篇的内容,记录一下数据对象
和事件处理
ide
其实继承BaseObservable的javBean叫作数据对象,官网介绍以下:布局
Any plain old Java object (POJO) may be used for data binding, but modifying a POJO will not cause the UI to update. The real power of data binding can be used by giving your data objects the ability to notify when data changes. There are three different data change notification mechanisms, Observable objects, observable fields, and observable collections. When one of these observable data object is bound to the UI and a property of the data object changes, the UI will be updated automatically.
大意是:学习
任何普通的Java对象(POJO)均可以用于数据绑定,但修改POJO不会致使UI更新。当数据改变的时候,您的数据对象可以发出通知,这才是数据绑定的威力。有三种不一样的数据更改通知机制: Observable对象,observable字段, 和observable集合. 当这些observable数据对象之一被绑定到UI而且数据对象的属性改变时,UI将被自动更新。
这个就是我在Android数据绑定DataBinding(一)入门篇中最后介绍的那样,将咱们的Bean继承 BaseObservable,这里再贴一下code;this
public class User extends BaseObservable{ private String userName; private int age; public User(String userName, int age) { this.userName = userName; this.age = age; } @Bindable public String getUserName() { return userName == null ? "" : userName; } public void setUserName(String userName) { this.userName = userName; notifyPropertyChanged(BR.userName); } @Bindable public int getAge() { return age; } public void setAge(int age) { this.age = age; notifyPropertyChanged(BR.age); } @Override public String toString() { return "User{" + "userName='" + userName + '\'' + ", age=" + age + '}'; } }
能够看到在setter方法中调用了notifyPropertyChanged(BR.age);
文档中这样介绍道:The Observable interface has a mechanism to add and remove listeners, but notifying is up to the developer.
也就是说,这种机制容许开发者本身对被监听的字段进行添加和删除,个人理解就是(看你本身想绑定那些字段)。code
相比于上一种方式,使用ObservableFields则能够减小许多的工做量,由于咱们能够许多提供的类型,文档介绍以下:ObservableField and its siblings ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, and ObservableParcelable.
示例:xml
public class People { public ObservableField<String> name = new ObservableField<>(); public ObservableInt age = new ObservableInt(); public ObservableList<String> list = new ObservableArrayList<>(); public People(String name, int age, ArrayList<String> list) { this.name = new ObservableField<>(name); this.age = new ObservableInt(age); this.list = (ObservableArrayList)list; } }
这样就不须要咱们本身在getter上设置@binding
,在setter中设置notifyPropertyChanged(int)
了。对象
官方列举了这样两个例子,ObservableArrayMap
和ObservableArrayList
,其中对ObservableArrayMap
的介绍是key是String这样的类型时,是很是有用的,示例以下:继承
ObservableArrayMap<String, Object> user = new ObservableArrayMap<>(); user.put("firstName", "Google"); user.put("lastName", "Inc."); user.put("age", 17);
在layout中three
<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"/>
个人理解就是一些集合类型的封装使用。
以前对某个View设置某种监听事件是经过setXXXX,在数据绑定中是如何实现的呢,有两种方式
监听器绑定(Listener Bindings)
<variable name="presenter" type="com.jiajia.mypractisedemos.module.jetpack.JetpackActivity.Presenter"/> ...... <Button android:text="click" android:textAllCaps="false" android:onClick="@{presenter.onClick}" android:layout_width="wrap_content" android:layout_height="wrap_content" />
public class Presenter { public void onClick(View view) { people.name.set("啊啊啊啊啊"); Toast.makeText(JetpackActivity.this, "点击了Button",Toast.LENGTH_SHORT).show(); } }
这里注意必须给定参数View view,即须要符合事件监听的写法。
这个说真的,没特别理解,简单整理一下,英文文档说:在方法引用中,方法的参数必须与事件监听器的参数匹配。在监听器绑定中,只有你的返回值必须与监听器的指望返回值相匹配(除非它预期为void),例如:
public class Presenter { public void onSaveClick(Task task){} }
而后,您能够将click事件绑定到您的类,以下所示:
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="task" type="com.android.example.Task" /> <variable name="presenter" type="com.android.example.Presenter" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{() -> presenter.onSaveClick(task)}" /> </LinearLayout> </layout>
注意这里没有传入view参数,可能这就是与方法引用不一样之处,固然也能够传啦,android:onClick="@{(view) -> presenter.onSaveClick(task)}"
,还有好几种,也不知道什么状况下用,也不懂,不写了,之后用到再说。我以为就方法引用的方式用得比较多,比较太low了平时写的代码。
方法引用和监听器绑定的主要区别在于实际的监听器实现是在绑定数据时建立的,而不是在事件触发时建立的。若是您喜欢在事件发生时计算表达式,则应该使用监听器绑定。
下午6点了,好饿,去食堂吃麻辣烫了!
此致,敬礼