MVVM简介
MVVM分为Model、View、ViewModel,它们的作用分别为:
- Model:简称数据模型,包括从服务端获取的json数据,bean,或者从本地获取的数据等等;
- View:UI视图,负责数据的显示(activity,fragment,控件view等等);
- ViewModel:就是与界面(view)对应的Model,View与Model通过ViewModel实现数据的双向绑定。进行数据的绑定和逻辑的代码的实现
MVVM 的优点
- 主要目的是分离视图(View)和模型(Model)
- 降低代码耦合,提高视图或者逻辑的重用性。
- 提高了模块的可测试性
下面引用一个自己写的模仿登录demo,来让大家体验一下MVVM,先来张效果图:
注意:
1、在guidle里添加databinding
dataBinding {
enabled = true
}
2、在布局里面要使用 标签
代码
MainActivity
class MainActivity : AppCompatActivity(), IBaseView {
lateinit var mPersonVM: LoginViewModel
var mBinding: ActivityMainBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
mPersonVM = LoginViewModel(this)
bt_login.setOnClickListener {
mPersonVM.getFristData(et_account.text.toString(), et_password.text.toString())
}
}
override fun setData(personBean: PersonBean) {
mBinding?.personBean = personBean//赋值之后就可以在textview中显示出来
}
}
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="com.example.mvvmkotlin_wy.R" />
<variable
name="personBean"
type="com.example.mvvmkotlin_wy.bean.PersonBean" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="帐号:1,密码:1,登录成功\n其他:登录失败"
app:layout_constraintBottom_toTopOf="@+id/et_account"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/et_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入帐号"
app:layout_constraintBottom_toTopOf="@id/et_password"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
app:layout_constraintBottom_toTopOf="@id/bt_login"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/et_account" />
<Button
android:id="@+id/bt_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"
app:layout_constraintBottom_toTopOf="@id/tv_status"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/et_password" />
<TextView
android:id="@+id/tv_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{personBean.status}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/bt_login" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
其他详细的代码可以下载demo来看:https://download.csdn.net/download/wy313622821/12822265