ViewModel+LiveData+DataBinding使用
在上面的內容中,知道了 DataBinding 的使用,以及 ViewModel和LiveData的使用,在LiveData的使用時,我們數據發生改變,如果需要更新UI,還需給數據增加一個監聽:
// 增加改變監聽
userViewModel.userLiveData.observe(this, Observer {user ->
text_view.text = user.toString()
})
這當然不是我們希望看到的,我們希望的是數據發生改變之後UI能夠自動更新,而不是手動設置值更新UI界面。剛好,DataBinding 就能夠實現這個功能,所以我們把 LiveData 和 DataBinding 一起使用,那麼代碼就更加的簡潔了。
以下的內容使用到了 DataBinding 的相關知識,同時使用到了 ViewModel 和 LiveData,如果對着幾個點不瞭解的,可以先通過上面的連接對相關的知識點進行了解。
ViewModel+LiveData+DataBinding使用
**首先需要搭建 ViewModel+LiveData+DataBinding 環境:開啓 DataBinding 支持,引入 ViewModel 和 LiveData 的依賴。**具體怎樣開啓可以通過上面鏈接查看。
-
建立數據類
data class User(var name: String = "", var age: Int = 0, var address: String)
-
建立 ViewModel 類 UserViewModel
class UserViewModel : ViewModel() { var userData: MutableLiveData<User> = MutableLiveData() init { userData.value = User("張三", 24, "杭州") // 延遲3秒後修改數據,UI自動更新 Thread{ SystemClock.sleep(3000) userData.value!!.name = "李四" userData.postValue(userData.value) }.start() } override fun onCleared() { Log.i("UserViewModel","onCleared:ViewModel 即將銷燬") } }
-
佈局文件,佈局文件中引入 UserViewModel
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="userViewModel" type="com.renj.mvvmtest.viewmodel.UserViewModel"/> </data> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{userViewModel.userData.name}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/> </android.support.constraint.ConstraintLayout> </layout>
<data><data/>
標籤內容表示引入UserViewModel
android:text="@{userViewModel.userData.name}"
將UserViewModel
的變量userData
的值設置給 TextView控件
-
Activity:Activity的代碼非常簡單了
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) var mainBinding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main) mainBinding.userViewModel = ViewModelProviders.of(this).get(UserViewModel::class.java) mainBinding.lifecycleOwner = this } }
mainBinding.userViewModel = ViewModelProviders.of(this).get(UserViewModel::class.java)
給佈局文件設置UserViewModel
mainBinding.lifecycleOwner = this
表示調用DataBinding#setLifecycleOwner(@Nullable LifecycleOwner lifecycleOwner)
方法,調用了這個方法,我們使用的LiveData就能夠感應到相關組件的生命週期,在對應的時候更新UI。