Android MVVM模式入門 - DataBinding的使用

前言

JetPack系列文章已更新:https://huanglinqing.blog.csdn.net/article/details/106215492

2020.0405 更新- 本文只講解DataBinding的使用,非架構MVVM

關於開發模式的文章,這應該算是第二篇,第一篇中講解了Android MVP模式的使用:https://blog.csdn.net/huangliniqng/article/details/80570920

mvp模式的優點就不說了,缺點其實在使用的過程中很顯然,比如現在有個需求對數據庫的學生表增刪改查,那麼view的接口,我們可能有如下定義

interface view{

    void get();

    void delete();

    void add();

    void update();

}

我們在使用的View層繼承下列接口即可,但如果有兩個Activity,一個需要查詢、一個需要修改、一個需要所有功能,那麼這個時候如果我們繼承這個view接口,肯定會出現View層含有沒有使用的接口。當然我們可以將四個接口放在四個view層,但工作量和維護起來並不方便。

一、Android MVVM介紹

個人認爲,MVVM的出現,並不是解決上述MVP的缺點,無論是MVP、MVC或是MVVM都有各自的缺點和優點,在開發中選擇合適的開發模式,纔能有助於開發工作。

    MVVM並不是分爲了四層,而是將MVP中的P層變爲了ViewModel層。還是以查詢數據爲例,如果我們要將查詢出來的數據顯示在控件上,我們要定義view層的如下方法

void setData(String data);

在Activity的接口回調中進行setText,但是如果顯示的數據特別多,就要set多次,MVVM的最佳使用方式是MVP+DataBinding,MVVM可以實現數據直接和View層的控件綁定,和監聽事件的綁定。接下來我們開始介紹MVVM的使用步驟。

二、DataBinding的使用步驟

2.1 引入Data Binding函數庫

在build .gradle中使用如下設置支持dataBinding:

dataBinding{
    enabled = true
}

2.2 新建一個User實體類

爲了模擬數據我們新建一個User類如下

public class User {

    private String UserName;
    private String UserSex;

    public String getUserName() {
        return UserName;
    }

    public void setUserName(String userName) {
        UserName = userName;
    }

    public String getUserSex() {
        return UserSex;
    }

    public void setUserSex(String userSex) {
        UserSex = userSex;
    }

    public User(String userName, String userSex) {
        UserName = userName;
        UserSex = userSex;
    }
}

2.3 編寫xml佈局,有兩個textview一個顯示UserName,另一個顯示UserSex,在普通的xml佈局中我們都是使用LinearLayout或者是其他的ViewGroup,但是在mvvm中我們使用的根佈局是layout,xml佈局代碼如下所示:
 

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="User"
            type="lonbon.com.mvvm.bean.User" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/userName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{User.userName}" />

        <TextView
            android:id="@+id/userSex"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{User.userSex}" />

    </LinearLayout>
</layout>

佈局中我們要注意的是這個data便籤,其中type字段是數據綁定對應的實體類,name就是我們引用的一個屬性標誌,在這裏寫爲User,如果要給textView賦值,我們直接通過@{User.屬性},相當於把userSex屬性變量賦值給id爲userSex的TextView。

2.4 在Activity中引用

以爲我們已經配置了databinding屬性爲true,所以會自動爲我們生成Binding類,生成規則爲佈局名後面加Binding,比如我們這裏的佈局名稱是activity_main,生成的Bingding類就是ActivityMainBinding,我們在Activity中通過下列代碼使用:

ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("黃林晴", "男");
activityMainBinding.setUser(user);

我們通過DataBindingUtil獲取databinding類直接與User數據綁定,運行程序,那麼會直接將userName和userSex賦值到相應的值。

結果如圖所示:

如果我們是給ListView中的Item中的控件賦值,那麼xml佈局中的代碼都是一致的,不同的是獲取bingding類是使用

ListItemBinding bingding = ListItemBinding.inflate(layoutInflater,ViewGroup,false);

  或者使用

ListItemBinding bingding = DataBindingUtil.inflate(layoutInflater,R.layout.activity_main,ViewGroup,false);

三、DataBing使用之監聽事件

DatabBing監聽事件的使用其實個人感覺使用的效果並不好,因爲現在差不多都是使用ButterKnife直接生成監聽事件,不過還是要提一下,我們在之前的佈局上加一個button,給button賦值監聽事件,首先我們定義一個監聽事件的類,我們可以在這個類中專門處理所有的監聽事件,類似於js這也算一個好處吧。

3.1 定義一個Click類,聲明一個test監聽方法

代碼如下所示:

public class Click {

    private String tag = "click";
    public void test(View v) {
        Log.d(tag, "點擊事件觸發了");
    }
}

3.2 在xml中進行綁定

在data標籤中再添加一個variable標籤

<variable
    name="Click"
    type="lonbon.com.mvvm.click.Click"/>

在button中爲onclick屬性設置

<Button
    android:text="text"
    android:onClick="@{Click.Text}"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

最後記得在activity進行設置:

activityMainBinding.setClick(new Click());

這裏要注意的是並不是調用setClick方法,如果你新建的監聽方法類是Text那麼就要調用setText進行監聽事件的綁定,我們來點擊按鈕,打印結果如下:

 

DataBinding的使用主要就是這樣了,還有一些功能需要深入研究,後續繼續分享。

代碼男人技術交流羣

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章