mvp的了解
mvp模式的设计,首先m-model,v-view,p-presenter。
- model层主要时进行数据的处理,提供业务逻辑的数据结构(定义类),提供数据的获取(从本地数据库或者远程网络获取数据),提供数据的存储。
- view层,主要负责界面的显示,不涉及任何业务逻辑处理,
- presenter层,负责业务的逻辑处理,
model和view不能直接通信,presenter层负责充当中间人,实现model层和view层之间的间接通信。
view层和presenter层互相持有对方的引用,实现view层和presenter层之间的通信。
demo
目录:
- contract
- testCOntracts
- model
- testModel
- presenter
- testPresenter
- view
- testPage
在contract中定义类,内有三个接口,view,model,presenter,定义相应的方法名。
class TestContracts{
interface View{
fun getContext():Context
fun refreshList(dataList: List<SearchHotBean>)
}
interface Presenter{
fun attach(view: View)
fun onItemClick(position: Int)
}
interface Model{
fun getHotList(page: Int): List<SearchHotBean>?
}
}
在testModel.kt中定义请求网络数据的函数,返回网络数据:
override fun getHostList(page:Int):List<T>{
//默认return emptyList();
}
在testPresenter.kt中通过一个子线程来获取网络数据,然后调用view层的refreshList实现数据来时的刷新。设置点击事件等等其他操作。
Override fun attach(view:TestContracts.View){
//开启子线程;
}
override fun onItemClick(position:Int){}
在testView.kt中,要么是activity,要么是fragment,反正跟页面相“联结”,然后持有一个presenter的实例化对象,用该实例化对象的方法获取数据并显示在界面上。
Private val presenter=TestPresenter()
override fun onCreate(savedInstanceState Bundle?){
super.onCreate(savedInstanceState)
//各种绑定操作
presenter.attach(this)
},
另外还有adapter等自定义适配器也可以写在该页面中。
class ListAdapter(private val list : List<SearchHotBean>,var context:Context):RecyclerView.Adapter<ListAdapter.ViewHolder>(){
override fun onCreateViewHolder(patent: ViewGroup,viewType: Int): ViewHolder{}
override fun onBindViewHolder(holder: ViewHolder,position: Int){}
override fun getItemCount(): Int=list.size
inner class ViewHolder(itemView: View) RecyclerView.ViewHolder(itemView){}
}