databinding学习第三天
使用可观察数据对象
1.可观察字段
在创建实现 Observable 接口的类时要完成一些操作,但如果您的类只有少数几个属性,则这样操作的意义不大。在这种情况下,您可以使用通用 Observable 类和以下特定于基元的类,将字段设为可观察字段:
- ObservableBoolean
- ObservableByte
- ObservableChar
- ObservableShort
- ObservableInt
- ObservableLong
- ObservableFloat
- ObservableDouble
- ObservableParcelable
创建
ObservableInt observableInt=new ObservableInt(11);
ObservableField<String> str=new ObservableField("1");
访问
observableInt.get();
str.get();
布局文件
<data>
<import type="androidx.databinding.ObservableInt"/>
<import type="androidx.databinding.ObservableField"/>
<variable
name="str"
type="ObservableField<String>" />
<variable
name="myInt"
type="ObservableInt" />
</data>
...
<TextView
android:text="@{str}"
android:gravity="center"
android:id="@+id/tv_observable1"
android:onClick="@{myClick}"
android:layout_margin="10dp"
android:layout_gravity="center_vertical"
tools:text="可观察字段"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:text="@{String.valueOf(myInt)}"
android:gravity="center"
android:id="@+id/tv_observable2"
android:onClick="@{myClick}"
android:layout_margin="10dp"
android:layout_gravity="center_vertical"
tools:text="可观察对象"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
2.可观察集合
map类型
创建
ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);
布局文件
<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"/>
普通list类型
创建
ObservableArrayList<Object> user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);
布局文件
<data>
<import type="androidx.databinding.ObservableList"/>
<variable
name="myList"
type="ObservableList<Object>" />
</data>
...
<TextView
android:text="@{myList[0]}"
android:gravity="center"
android:id="@+id/tv_observable5"
android:onClick="@{myClick}"
android:layout_margin="10dp"
android:layout_gravity="center_vertical"
tools:text="可观察List"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
官方demo的一点说明

3.可观察对象
实现Observable
接口的类允许注册监听器,以便它们接收有关可观察对象的属性更改的通知。
Observable
接口具有添加和移除监听器的机制,但何时发送通知则必须由您决定。为便于开发,数据绑定库提供了用于实现监听器注册机制的 BaseObservable
类。实现 BaseObservable
的数据类负责在属性更改时发出通知。具体操作过程是向getter
分配Bindable
注释,然后在 setter 中调用 notifyPropertyChanged()
方法,如以下示例所示:
private static class User extends BaseObservable {
private String firstName;
private String lastName;
@Bindable
public String getFirstName() {
return this.firstName;
}
@Bindable
public String getLastName() {
return this.lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
notifyPropertyChanged(BR.firstName);
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
}
注意:当用@Bindable注解后,先编译一遍,不然BR类中找不到对应的参数
完整实例代码
- ObservableActivity.java
public class ObservableActivity extends AppCompatActivity implements View.OnClickListener {
ActivityObservableBinding binding;
ObservableBean observableBean=new ObservableBean(new ObservableInt(0));
ObservableInt observableInt=new ObservableInt(11);
ObservableMap<String,Integer> observableMap;
ObservableList<Object> observableList;
ObservableField<String> str=new ObservableField("1");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
observableMap=new ObservableArrayMap<>();
observableList=new ObservableArrayList<>();
observableMap.put("age",18);
observableList.add("我是一");
observableList.add(18);
observableList.add("Google");
binding =DataBindingUtil.setContentView(this,R.layout.activity_observable);
binding.setMyClick(this);
binding.setTempBean(observableBean);
binding.setMyInt(observableInt);
binding.setMyMap(observableMap);
binding.setMyList(observableList);
binding.setStr(str);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.tv_observable1:
str.set(str.get()+"1");
break;
case R.id.tv_observable2:
observableInt.set(observableInt.get()+33);
break;
case R.id.tv_observable3:
observableMap.put("age",observableMap.get("age")+1);
break;
case R.id.tv_observable4:
observableBean.setAge(new ObservableInt(observableBean.getAge().get()+1));
break;
case R.id.tv_observable5:
observableList.add(0,str.get());
break;
}
}
}
- activity_observable.xml
<?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>
<import type="android.view.View.OnClickListener"/>
<import type="androidx.databinding.ObservableInt"/>
<import type="androidx.databinding.ObservableMap"/>
<import type="androidx.databinding.ObservableList"/>
<import type="androidx.databinding.ObservableField"/>
<variable
name="tempBean"
type="com.hwp.databindingdemo.bean.ObservableBean" />
<variable
name="str"
type="ObservableField<String>" />
<variable
name="myInt"
type="ObservableInt" />
<variable
name="myMap"
type="ObservableMap" />
<variable
name="myList"
type="ObservableList<Object>" />
<variable
name="myClick"
type="OnClickListener" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.ObservableActivity">
<TextView
android:text="@{str}"
android:gravity="center"
android:id="@+id/tv_observable1"
android:onClick="@{myClick}"
android:layout_margin="10dp"
android:layout_gravity="center_vertical"
tools:text="可观察字段"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:text="@{String.valueOf(myInt)}"
android:gravity="center"
android:id="@+id/tv_observable2"
android:onClick="@{myClick}"
android:layout_margin="10dp"
android:layout_gravity="center_vertical"
tools:text="可观察对象"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:text="@{String.valueOf(myMap.age)}"
android:gravity="center"
android:id="@+id/tv_observable3"
android:onClick="@{myClick}"
android:layout_margin="10dp"
android:layout_gravity="center_vertical"
tools:text="可观察Map"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:text="@{String.valueOf(tempBean.age)}"
android:gravity="center"
android:id="@+id/tv_observable4"
android:onClick="@{myClick}"
android:layout_margin="10dp"
android:layout_gravity="center_vertical"
tools:text="可观察实体类t"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:text="@{myList[0]}"
android:gravity="center"
android:id="@+id/tv_observable5"
android:onClick="@{myClick}"
android:layout_margin="10dp"
android:layout_gravity="center_vertical"
tools:text="可观察List"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
- ObservableBean.java
public class ObservableBean extends BaseObservable {
ObservableInt age;
@Bindable
public ObservableInt getAge() {
return age;
}
public void setAge(ObservableInt age) {
this.age = age;
notifyPropertyChanged(com.hwp.databindingdemo.BR.age);
}
public ObservableBean(ObservableInt age) {
this.age = age;
}
public ObservableBean() {
}
}
网友评论