MVVM之DataBinding模式的基本使用

簡介

View:主要進行視圖控件的一些初始設置,不應該有任何的數據邏輯操作。

Model:定義實體類,以及獲取業務數據模型,比如通過數據庫或者網絡來操作數據等。

ViewModel:作爲連接 View 與 Model 的中間橋樑,ViewModel 與 Model 直接交互,處理完業務邏輯後,通過 DataBinding 將數據變化反應到用戶界面上。

 

配置

在 Module:app 的 build.gradle 文件添加如下代碼:

android {
    // ...
    dataBinding {
        enabled = true
    }
}

佈局

DataBinding 佈局文件的根標籤是 layout 標籤,layout 裏面有一個 data 元素和 View 元素,data 元素裏面的 main 就是我們自定義的 main 實體類

<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <data >
        <variable
            name="main"
            type="com.epuxun.drink.bean.MainBean" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/tv_msg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{main.msg}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="@{main.buttonText}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tv_msg" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

MainBean實體類代碼如下:

class MainBean{

    var msg = ObservableField<String>()
    var buttonText = ObservableField<String>()

    init {
        msg.set("dataBing")
        buttonText.set("點擊測試")
    }
}

這個實體類的元素是 DataBinding 中的 ObservableField 類,ObservableField 的作用是,當我們實體類中的值發生改變時,會自動通知View刷新。所以使用 DataBinding 的時候,建議使用 ObservableField 來定義實體類。

 

綁定 layout

val activityMainBinding = DataBindingUtil.setContentView<ActivityMvvmBinding>
    (this, R.layout.activity_mvvm)
val main = MainBean()
activityMainBinding.main = main

類名activityMainBinding生成規則:佈局文件名+Binding

當然也可以自定義類名,自定義類名需要在佈局文件添加如下代碼

<data class="MainActivityBinding">

綁定代碼更改爲

val mainActivityBinding = DataBindingUtil.setContentView<MainActivityBinding>
    (this, R.layout.activity_mvvm)
val main = MainBean()
mainActivityBinding.main = main

測試改變MainBean數據UI同時改變

button.setOnClickListener {
    main.msg.set("${i++}")
}

自定義基類

abstract class BaseActivity<T : ViewDataBinding> : AppCompatActivity() {

    abstract fun getLayoutId(): Int

    abstract fun initView(activityBinding: T)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val activityBinding = DataBindingUtil.setContentView<T>(this, getLayoutId())
        initView(activityBinding)
    }
}

使用

class MainActivity : BaseActivity<MainActivityBinding>() {

    private var i = 0

    override fun getLayoutId(): Int {
        return R.layout.activity_mvvm
    }

    override fun initView(activityBinding: MainActivityBinding) {
        val main = MainBean()
        activityBinding.main = main

        button.setOnClickListener {
            main.msg.set("${i++}")
        }
    }

}

 

 

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