一.定义:
MVVM是MVP的升级版,其中的
1.Model负责数据实体模型、数据获取、存储等。
2.View负责界面对应xml和activity/fragment
3.VM是ViewModel的缩写可以理解成是View的数据模型和Presenter的合体,负责Model和View之间的交互,处理业务逻辑,ViewModel和View层之间的交互通过谷歌的框架data-binding来完成,而Data Binding可以实现双向的交互,这就使得视图和控制层之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力。
databinding的使用单独有篇文章做了介绍:
https://blog.csdn.net/liulanzaijia/article/details/89512487
二.kotlin mvvm实例:
1.这里以一个列表的数据获取和展示为例子,首先看下项目结构:
2.Model层,获取数据层,这里使用rxjava+retrofit来获取网络数据
interface IPersonModel{
fun loadPersonList(loadListener: BaseLoadListener<List<PersonBean>>)
}
class PersonModel: IPersonModel{
override fun loadPersonList(loadListener: BaseLoadListener<List<PersonBean>>) {
val apiService = ApiClient().getApiService()
apiService!!.getPersionList(1)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({ result ->
var result : List<PersonBean> = result.data!!
loadListener.loadSucess(result)
},
{
error -> loadListener.loadFailure(error.message!!)
}
)
}
}
2.View层,数据的显示,通过databinding来绑定数据,该页面主要是一个recyclerview
class MainActivity : AppCompatActivity() ,IBaseView {
var mPersonVM : PersonViewModel? = null
var mAdapter : PersonAdapter? = null
var mBinding : ActivityMainBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)
initView()
mPersonVM = PersonViewModel(this, mAdapter!!)
}
fun initView(){
val layoutManager = LinearLayoutManager(this)
mBinding!!.rvPerson.setLayoutManager(layoutManager)
mAdapter = PersonAdapter()
mBinding!!.rvPerson.setAdapter(mAdapter)
}
3.ViewModel层,负责view和model之间的交互:
class PersonViewModel(personView : IBaseView,adapter : PersonAdapter): BaseLoadListener<List<PersonBean>>{
private var mPersonView : IBaseView = personView
private var mAdapter : PersonAdapter = adapter
private var mPersonModel : IPersonModel? = null
init {
mPersonModel = PersonModel()
getFristData()
}
private fun getFristData(){
mPersonModel!!.loadPersonList(this)
}
override fun loadSucess(list: List<PersonBean>) {
mAdapter.refreshData(list)
mPersonView.loadComplete()
}
override fun loadFailure(error: String) {
mPersonView.loadFailure(error)
}
}
demo代码地址: