zoukankan      html  css  js  c++  java
  • 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();
     

    这种方式就方便多了;

  • 相关阅读:
    ASP.NET获取POST提交过来的数据流,转换成Json格式的字符串
    Lambda表达式遍历和泛型ForEach遍历方式
    asp.net动态加载程序集创建指定类的实例及调用指定方法
    解答VS2013编译报错不准确是什么原因
    Sql Server常用数据库函数小结
    如何往有自增标识字段的表插入数据时,同时给自增标识字段插入值呢,在Inset Into语句前后加上SQL语句:SET IDENTITY_INSERT TableName ON和SET IDENTITY_INSERT TableName OFF
    ASP.NET代码调用SQL Server带DateTime类型参数的存储过程抛出异常问题
    关于Asp.net事件,如何在触发子控件的事件时,同步触发父页面的事件
    02Modify.ashx(修改班级信息)
    01List.ashx(班级列表动态页面)
  • 原文地址:https://www.cnblogs.com/zhangqie/p/9638141.html
Copyright © 2011-2022 走看看