使用MVPVM架构:
一种View绑定一种ViewModel, 因为View需要ViewModel提供界面数据, 而同一个ViewModel可以绑定不同的View, 可以轻松实现一种ViewModel对应不同的View. 在框架中的RecycleView就是通过该方式控制不同的Item类型的, 状态组件也是通过该方式实现的. 例如: 在订单列表界面, 不同的订单状态显示的布局不一致, 但是Bean又是一样的, 这时可以在ViewModel中根据不同的状态,加载不同的布局文件.
在Presenter中, 只处理数据也事件, 不直接与界面上的View交互, 因此, 在Presenter中也不会持有View的引用(弹窗除外) , 那Presenter怎么控制View, 通过数据进行间接控制. 例如: 付款按钮根据订单状态不同而显示隐藏, 在Presenter中要控制该按钮, 只要修改订单状态即可, 按钮的显示隐藏是ViewModel与View的事件.
数据流动: 用户->View->Presenter->Model->Presenter->ViewModel->View->用户 例如: 用户点击按钮->Presenter调用Model接口->Model获取数据->返回给Presenter->Presenter转给ViewModel->View根据ViewModel自动更新->展示给用户
需要获取数据情况: 用户输入->ViewModel双向绑定自动同步->Presenter处理输入事件或点击事件->Presenter调用Model接口->->Model获取数据->返回给Presenter->Presenter转给ViewModel->View根据ViewModel自动更新->展示给用户
ViewModel中数据分为两类:
与MVP相比, P层的职责更明确, 只需要负责生命周期事件和点击事件等交互事件. 与MVVM相比, ViewModel的职责也更明确, 只需要处理数据与UI的关系. 无需处理业务逻辑事件等.
注意: 基础Activity继承了Presenter层接口, 表示Presenter的角色.
- app 应用主包
- baseframe 基础mvpvm架构
- common 通用组件
- data 数据层,存放bean,接口等
- library 第三方应用的包以及针对第三方包的封装
class TestBaseActivity : BaseBindingActivity<TestBaseViewModel, ViewDataBinding>() {
//布局文件放在viewModel或者这里都可以,优先这里的,如果这里返回0才会使用viewmodel中的
//如果是lazy的界面,那就只能在viewmodel中获取布局
override fun getLayoutId(): Int {
return R.layout.activity_test_base
}
override fun initParams() {
//处理入参
}
override fun initContent() {
setTitle("测试基础框架")
}
override suspend fun fetchData() {
//获取数据
}
override fun onClick(view: View) {
//处理点击事件
}
}
@AndroidEntryPoint
class TestListActivity : BaseListActivity<TestListViewModel, ViewDataBinding>(), IItemViewLongClickListener{
override fun initParams() {
}
override fun initContent() {
setTitle("测试列表界面")
//设置开启下拉刷新
setRefreshEnable(true)
//设置开启加载更多
setLoadMoreEnable(true)
}
override suspend fun fetchData() {
//测试加载动画
delay(1000)
refreshData()
}
override fun onClick(view: View) {
//处理点击事件
}
override suspend fun fetchData(pageNum: Int, pageSize: Int, useCache: Boolean, param: Any?) {
//分页获取列表数据
val list = ArrayList<BaseItemViewModel<*>>()
list.add(TestItemViewModel("测试数据pageNum:${pageNum}"))
list.add(TestItemViewModel("测试数据${pageNum}"))
//设置数据和页码
setData(list, pageNum)
}
override fun onItemClick(view: View, itemViewModel: BaseViewModel) {
//item的点击事件
}
}
其他范例可以直接查看app模块中的com.wjjun.test中
包括了大部分常用的布局和用法
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。