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。
-