kotlin使用mvvm搭建框架

本文深入解析MVVM架构,包括Model、View和ViewModel的作用与交互方式,通过Kotlin实例展示如何使用RxJava+Retrofit获取数据,并利用DataBinding实现双向数据绑定,降低视图与控制层的耦合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.定义:

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.youkuaiyun.com/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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值