美文网首页
Jetpack学习(二)——databinding(3)

Jetpack学习(二)——databinding(3)

作者: 岁月静好浅笑安然 | 来源:发表于2020-01-10 11:11 被阅读0次

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&lt;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&lt;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的一点说明

官方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&lt;String>" />
        <variable
            name="myInt"
            type="ObservableInt" />
        <variable
            name="myMap"
            type="ObservableMap" />
        <variable
            name="myList"
            type="ObservableList&lt;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() {
    }


}

相关文章

网友评论

      本文标题:Jetpack学习(二)——databinding(3)

      本文链接:https://www.haomeiwen.com/subject/dojpactx.html