android studio 30天学习笔记-day 14-databinding 单向绑定

之前了解了UI的元件跟data之间是如何进行绑定的,那麽在当data发生改变时,又该如何及时让data的变化反应在ui上呢?这时可以使用单向绑定的方法执行。

单向绑定更新UI:

1.使用BaseObservable
2.使用ObservableField

BaseObservable

刷新ui有2种方式:
1.notifyChange(); 更新所有的UI
2.notifyPropertyChanged(); 只更新绑定的UI

首先在model里extends BaseObservable

public class DataItem extends BaseObservable {
    @Bindable //一定要新增@Bindable注解,不然编译时会出错
    private String name;
    private String Msg ;
    private boolean colorChange;

    public boolean isColorChange() {
        return colorChange;
    }

    public void setColorChange(boolean colorChange) {
        this.colorChange = colorChange;
        notifyChange();//在setter方法中加入notifyChange();
    }

    public String getMsg() {
        return Msg;
    }

    public void setMsg(String msg) {
        Msg = msg;
        notifyChange();//在setter方法中加入notifyChange();
    }

    @Bindable
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyChange();//在setter方法中加入notifyChange();
    }
}

在UI跟DATA做绑定

<TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{dataItem.name}"
           android:textSize="40sp"/>
           
<TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{dataItem.msg}"
           android:textSize="40sp"/>
           
<Button
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:onClick="onSendMsg"
           android:text="click1"
           android:textSize="40sp" />
           
<Button
           android:layout_width="50sp"
           android:layout_height="50sp"
           android:layout_marginLeft="180dp"
           app:heart="@{dataItem.colorChange}" />

MainActivity2的部分

public class MainActivity2 extends AppCompatActivity{
    ActivityMain2Binding main2Binding;
    DataItem dataItem;
    ClickHandler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();

    }
    private void init() {
        main2Binding=DataBindingUtil.setContentView(this,R.layout.activity_main2);
        dataItem=new DataItem();
        main2Binding.setDataItem(dataItem);
        
        handler=new ClickHandler(MainActivity2.this);
        main2Binding.setHandler(handler);
    }

    public void onSendMsg(View view) {
        if (!dataItem.isColorChange()) {
            dataItem.setName("eles123");
            dataItem.setMsg("Welcome eles's note.");
            dataItem.setColorChange(true);
        }else {
            dataItem.setColorChange(false);
            dataItem.setName("eles");
            dataItem.setMsg("hello");
        }
 }

这样就完成了BaseObservable的使用方法了

那麽接下来换ObservableField

使用ObservableField

ObservableField这个类是接收泛型,可以直接更新UI
先建立一个model

public class DataItem2 {
    public final ObservableField<String> name=new ObservableField<>();
    public final ObservableField<String> Msg=new ObservableField<>();
}

xml都差不多

 <variable
            name="observableData2"
            type="com.example.newtest.databindView.DataItem2" />
            
  <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{observableData2.name}"
            android:textSize="40sp"/>          

activity

 public void click2(View view) {
        count=(int)(Math.random()*10)+1 ;//设乱数
        dataItem2.name.set("eles"+count);
    }

使用ObservableField的set方法就可以看到更新UI的效果了。


<<:  [Day15]程序菜鸟自学C++资料结构演算法 – 二元树的基本应用

>>:  Angular 深入浅出三十天:表单与测试 Day14 - 单元测试实作 - 被保人 by Reactive Forms

有关文组转工程师 聊聊

各位好 小弟就是大家口中所说的 文组工程师 去年四月资策会java班毕业,後来因疫情到去年底才上工 ...

Day22 切版笔记- 互动图文卡片

运用到的观念: 利用vertical-align: middle;调整图片预设多余的空间 使用po...

连续 30 天 玩玩看 ProtoPie - Day 12

第二种启动相机的方法 昨天勾选 Camera 的 Auto Start 来启动相机。 今天使用第二种...

如何衡量万事万物 (10) 人的判断

(续上) 无变异比较 & 拉许模型 教育评量的领域,对「能力」有大量的衡量需求。其中有一个值...

【设计+切版30天实作】|Day14 - 简约CTA的用处及设计的注意事项

设计大纲 设计CTA的用意一方面是让结尾不会来得太突然,另一方面是想在网页的最後再来一个「Call ...