ViewModel+LiveData+DataBinding使用

ViewModel+LiveData+DataBinding使用

Android DataBinding 使用博客說明

Android DataBinding 使用測試代碼

簡書:ViewModel、LiveData 使用

CSDN:ViewModel、LiveData 使用

在上面的內容中,知道了 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 的依賴。**具體怎樣開啓可以通過上面鏈接查看。

  1. 建立數據類

     data class User(var name: String = "", var age: Int = 0, var address: String)
    
  2. 建立 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 即將銷燬")
         }
     }
    
  3. 佈局文件,佈局文件中引入 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控件
  4. 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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章