AndroidMvvm练习
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