Android MVVM Demo

    技术2022-07-11  84

    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

    Processed: 0.016, SQL: 9