美文网首页
Android DataBinding(二) 之 数据绑定

Android DataBinding(二) 之 数据绑定

作者: Sharkchilli | 来源:发表于2020-12-23 22:16 被阅读0次

    前言

    现在来说明一下DataBinding的数据绑定

    单向数据绑定

    这里的单向数据绑定指的是model类的数据变化,界面的数据跟着变化
    BaseObservable
    先对model进行改造

    package com.shart.model;
    
    import androidx.databinding.BaseObservable;
    import androidx.databinding.Bindable;
    
    import com.shark.databindingdemo2.BR;
    
    public class User extends BaseObservable {
        //如果是 public 修饰符,则可以直接在成员变量上方加上 @Bindable 注解
        @Bindable
        public String name;
    
        private String age;
    
        public User(String name, String age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
    
        }
    
        //更新指定属性
        public void myNotifyPropertyChanged() {
            notifyPropertyChanged(com.shark.databindingdemo2.BR.name);
        }
    
        //更新所有字段
        public void myNotifyChange() {
            notifyChange();
        }
    
        //如果是 private 修饰符,则在成员变量的 get 方法上添加 @Bindable 注解
        @Bindable
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
    
        }
    }
    

    当给属性加上@Bindable注解的时候DataBinding会自动生成一个BR.Field (这里在使用这个BR的时候可能会报错你运行一下app让其生成就可以了)

    notifyChange方法会改变所有的属性显示
    notifyPropertyChanged改变其指定的属性

    在适当的时候调用notifyChange或者notifyPropertyChanged方法就可以了,这里就不做演示了

    还可以在model添加一个回调方法,这样属性改变的时候就能做一些处理了

     user.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
                @Override
                public void onPropertyChanged(Observable sender, int propertyId) {
                    
                }
            });
    

    这里的propertyId参数就是生成的BR的值了

    ObservableField
    我们可以不用继承BaseObservable,也不用自己手动去notify
    所以可以使用以下方式

    将model改为以下

    package com.shart.model;
    
    import androidx.databinding.ObservableField;
    
    public class ObservableUser {
        private ObservableField<String> name;
    
        private ObservableField<String> age;
    
        public ObservableUser(String name, String age) {
            this.name = new ObservableField<>(name);
            this.age = new ObservableField<>(age);
        }
    
        public ObservableField<String> getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = new ObservableField<>(name);
        }
    
        public ObservableField<String> getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = new ObservableField<>(age);
        }
    }
    
    

    修改属性的时候使用 以下方法

      public void changeAll() {
                user.getName().set("code" + new Random().nextInt(100));
                user.getAge().set("age"+new Random().nextInt(100));
            }
    

    ObservableField还支持基本数据类型,例如 ObservableBoolean、ObservableByte、ObservableChar、ObservableShort、ObservableInt、ObservableLong、ObservableFloat、ObservableDouble 以及 ObservableParcelable ,

    ObservableCollection
    这个就是封装了List、Map等类。将它变为ObservableList、ObservableMap。
    使用起来和List、Map无区别,只是会自动更新ui数据

    双向数据绑定

    双向绑定的意思即为当数据改变时同时使视图刷新,而视图改变时也可以同时改变数据

    这里只要在布局文件中改一个地方就行了,@后面加上=

    android:text="@={userInfo.name}"
    

    相关文章

      网友评论

          本文标题:Android DataBinding(二) 之 数据绑定

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