MVP模式(Model-View-Preserter):总的来说就是将数据(Model)和视图(View)分离来,通过Preserter实现了数据和视图的交互,好处降低了耦合性,更方便进行测试。
1、Model层:负责存放一些数据和对数据进行操作。
package com.example.unlock2
import android.widget.ImageView
data class ImageViewModel(
var view:ImageView,
var normalResId:Int,
var errorResId:Int
) {
fun changeImage(isNormal:Int) {
if (isNormal == normalResId) {
view.setImageResource(normalResId)
}else{
view.setImageResource(errorResId)
}
}
}
2、View层:对视图上的数据进行显示和接收,解析试图上的控件,监听视图上的一些数据的变动。比如View可以监听用户的触摸事件。
//给容器添加触摸事件
binding.container.setOnTouchListener { v, event ->
val x = event.x
val y = event.y
when(event.action){
MotionEvent.ACTION_DOWN ->presenter.userTouch(x,y)
MotionEvent.ACTION_MOVE ->presenter.userTouch(x,y)
MotionEvent.ACTION_UP ->presenter.endTouch()
}
true
}
3、Presenter层:作为Model和View之间交互的桥梁,View的数据有变动时,将数据传到Presenter层,presenter在对这些数据进行处理,即用代码来具体逻辑实现,在这时presenter会调用到model里的数据和对数据操作的方法,最后又将处理好的数据传到View层进行显示.
对view传来的数据进行处理和传到View层显示
fun userTouch(x:Float, y:Float,) {
val dot:ImageView = isInView(x,y) ?:return
if(lastSelectedDot == null){
HighLight(dot)
}else{
//判断路线是否有
val lineView:ImageView = hasLine(dot) ?:return
//点亮线
HighLight(dot)
highlightLine(lineView)
}
}
private fun isInView(x:Float,y:Float):ImageView?{
mDotViewList.forEach {
if((x>=it.x&&x<=it.x+it.width)&&(y>=it.y&&y<=it.y+it.height)){
return it
}
}
return null
}
调用model的数据和方法
private fun changeColor(){
mViewModelsList.forEach {
it.changeImage(it.errorResId)
}
}
private fun changeBlack(){
mViewModelsList.forEach {
it.changeImage(it.normalResId)
}
}
4、接口:其实接口在MVP中是非常重要的,是连接view和presenter的桥梁,为了使V和P交互方便。在写代码时接口里的方法是很重要的连接了V和P,这里总结了一些接口中常见的使用方法:
showLoading(): 在View中调用,用于显示加载中的UI状态。
hideLoading(): 在View中调用,用于隐藏加载中的UI状态。
showData(data: Any): 在View中调用,用于显示数据。
showError(error: String): 在View中调用,用于显示错误信息。
onItemClick(item: Any): 在View中调用,用于处理列表项点击事件。
onButtonClicked(): 在View中调用,用于处理按钮点击事件。
getData(): 在Presenter中调用,用于获取数据。
requestData(): 在Presenter中调用,用于请求数据。
onDataReceived(data: Any): 在Presenter中调用,用于接收到数据后通知View进行显示。
onError(error: String): 在Presenter中调用,用于处理错误信息。
当然,这只是一些常见的示例方法,具体的接口方法可以根据具体业务需求进行定义和扩展。
接口:
interface IUnlockView{
fun showAlertText(text:String)
fun switchActivity()
}
在view中的具体实现
override fun showAlertText(text: String) {
binding.alertTitle.text = text
}
@SuppressLint("SuspiciousIndentation")
override fun switchActivity() {
//界面切换
val init = Intent(this,HomeActivity::class.java)
startActivity(init)
}
在presenter中的运用:
val mView:IUnlockView
mView.showAlertText("解锁成功")
mView.switchActivity()