kotlin使用mvvm搭建框架

一.定义:

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代码地址:

https://github.com/linwenbing/KotlinMVVMdemo.git

猜你喜欢

转载自blog.csdn.net/liulanzaijia/article/details/89641144