AndroidMVVM 是Google推出的,网上介绍也有很多,我就不废话了,公司项目中使用的mvvm,我整理个小demo练习记录一下
1.DataBinding
配置
dataBinding { enabled = true }在XML中使用, 原先的布局还是照常写
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="viewModel" type="com.pltest.mvvmtest.MainActViewModel" /> </data> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <!-- // 点击事件可以在act中设置 也可以在XML 直接写--> <Button android:id="@+id/btGet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="getData" android:textAllCaps="false" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout>2.ViewModel
新建ViewModel,继承至ViewModel
class MainActViewModel : ViewModel()在Activity中获取实例
private val mViewModel by lazy { ViewModelProviders.of(this).get(MainActViewModel::class.java) }XML中声明的VIewModel
<data> <variable name="viewModel" type="com.pltest.mvvmtest.MainActViewModel" /> </data>XML中的VIewModel 和ViewModel实例绑定
mBinding.viewModel = mViewModel在ViewModel 中声明LiveData
private val _countLive = ObservableField<String>() val countLive get() = _countLive private fun refreshCount() { _countLive.set("当前条数 : " + _dataLive.value?.size) } private val _dataLive = MutableLiveData<MutableList<Bean>>() val dataLive get() = _dataLive private fun setData(list: MutableList<Bean>) { _dataLive.value = list refreshCount() }在xml中可以直接设置监听ViewModel的数据变化 以及点击事件
<Button android:id="@+id/btAdd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{()->viewModel.addData()}" android:text="addData" android:textAllCaps="false" app:layout_constraintLeft_toRightOf="@id/btGet" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tvCount" android:layout_width="wrap_content" android:layout_height="0dp" android:gravity="center" android:text="@{viewModel.countLive}" android:textSize="18sp" app:layout_constraintBottom_toBottomOf="@id/btAdd" app:layout_constraintLeft_toRightOf="@id/btAdd" app:layout_constraintTop_toTopOf="parent" />在Activity中设置LiveData回调监
mViewModel.apply { dataLive.observe(this@MainActivity, Observer { mAdapter.setData(it) }) onItemChangeLive.observe(this@MainActivity, Observer { mAdapter.notifyItemChanged(it) }) }在列表中的点击事件,调用ViewModel中的方法。进行逻辑处理。操作数据
fun onItemClick(position: Int) { if (position > _dataLive.value?.size ?: 0) return val data = _dataLive.value ?: return data[position].isSelect = !data[position].isSelect _onItemChangeLive.value = position }最后附demo地址:https://github.com/13522280478/AndroidMVVMTest.git