• android -------- Data Binding的使用(三)Observable


     

    解决:databinding 中 ViewModel数据发生改变,View中也要改变(实时更新)

    BaseObservable

    在ViewModel 中可以继承 BaseObservable

    public class User extends BaseObservable {
    
        public User(String frstName,String lastName){
            this.frstName = frstName;
            this.lastName = lastName;
            observableArrayMap.put("zq","zhhhhh");
            list.add("aaa");
            list.add("bbb");
        }
    
        private String frstName;
    
        private String lastName;
    
        public ObservableArrayMap<String,String> observableArrayMap = new ObservableArrayMap<>();
    
        public ObservableArrayList<String> list = new ObservableArrayList<>();
    
        @Bindable
        public String getFrstName() {
            return frstName;
        }
    
    
        public void setFrstName(String frstName) {
            this.frstName = frstName;
            //刷新UI
            notifyPropertyChanged(com.zhangqie.databinding.BR.frstName);
        }
    
        @Bindable
        public String getLastName() {
            return lastName;
        }
    
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
            //全部刷新
            //notifyChange();
        }
    }

    在 set 方法里面,使用 notifyPropertyChanged 来通知 UI 刷新,notifyPropertyChanged 只会刷新具体的值,notifyChange 方法则会刷新所有的值。
    BR 的域则是通过在 get 方法上加 @Bindable 生成的。

    ObservableArrayMap

    与Java的Map使用相同

    public ObservableArrayMap<String,String> observableArrayMap = new ObservableArrayMap<>();
    
    observableArrayMap.put(
    "zq","zhhhhh");

    布局中:

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    
        <data>
    
            <variable
                name="user"
                type="com.zhangqie.databinding.demo2.User" />
    
        </data>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text='@{user.observableArrayMap["zq"]}' />
    
        </LinearLayout>
    
    </layout>

    ObservableArrayList

    与Java的List使用相同

     public ObservableArrayList<String> list = new ObservableArrayList<>();
     list.add("aaa");
     list.add("bbb");

    布局中:

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text='@{user.list[0]}' />
    
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{user.list[1]}" />

    Observable Fields

    继承自 BaseObservable 的方法有点复杂,DataBinding 还提供了一种简单的写法—-ObservableField来实现数据实时刷新

    public class UserObservableBean {
        public ObservableInt userId = new ObservableInt();
        public ObservableField<String> userName = new ObservableField<>();
        public ObservableDouble userAge = new ObservableDouble();
        public ObservableFloat userSex = new ObservableFloat();
    }

    直接把属性定义成 ObservableField 类型的,并且修饰符需要是 public final 的。
    除了 ObservableField,还可以使用 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable。
    访问值得时候,可以使用 get set 方法。

    UserObservableBean userBean = new UserObservableBean();
    userBean.userId.set(8);
    userBean.userName.set("切切心语");
    userBean.userAge.set(25);

    userBean.userId.get();
    userBean.userName.get(); userBean.userAge.get();
     

    这种方式就方便多了;

  • 相关阅读:
    vscode安装
    Linux下 Python绘图与可视化 及matplotlib与_tkinter安装
    C语言-结构体定义的几种方式
    leetcode- 88. 合并两个有序数组
    leetcode-16. 最接近的三数之和
    Leetcode-15. 三数之和
    Leetcode-561. 数组拆分 I
    Windows_pycharm下安装numpy
    python实现两个两个的翻转字符串
    linux复制文件夹、重命名文件夹、删除文件夹
  • 原文地址:https://www.cnblogs.com/zhangqie/p/9638141.html
Copyright © 2020-2023  润新知