RycycleView与MVP模式的使用例子

这篇博客展示了如何在Android应用中结合RecyclerView和MVP模式来展示远程服务器上的好友列表。MVP的三个角色——Model、View、Presenter各自承担获取数据、处理数据和更新界面的任务。文中详细介绍了 Presenter如何通过Model的Okhttp接口获取数据,再由Presenter处理并通知View(Activity)更新RecyclerView。尽管存在疑问关于数据更新是否必须在主线程,但整个流程演示了一个标准的MVP模式实践。
摘要由CSDN通过智能技术生成

我们用RecyclerView来显示一个好友列表,数据从远程服务器数据库获得,然后就是一个非常适合的MVP模式的例子,Model负责通过Okhttp获取数据,Presenter接收Model的数据,处理后,通知View更新,非常标准的一个MVP模式。
首先看MVP的接口定义IModel、IView、IPresenter,通常都是把它们放到一个Contact接口类中统一管理:

import okhttp3.Callback

interface Contact {
   
    interface IView{
   
        fun setData(friendList:MutableList<FriendInfo>)
        fun onError(type:Int)
    }

    interface IModel{
   
        fun loadData(params:Map<*, *>, callback:Callback)
        fun addOrRemoveFriend(params:Map<*, *>, callback:Callback, type:Int)
        fun addUser(params:Map<*, *>, callback:Callback, type:Int)
    }

    interface IPresenter{
   
        fun attachView(view: IView)
        fun detachView()
        fun loadData(token:String)
        fun addOrRemoveFriend(token:String, friendToken:String, type:Int)
        fun addUser(token:String)
    }
}

再看我们的View,通常指Activity,与Presenter的交互:
1)绑定与解绑

 override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_friend_list)
        setSupportActionBar(toolbar)

        mPresenter = FriendPresenter()
        mPresenter.attachView(this)

        initListView()
        
    }

    override fun onDestroy() {
   
        super.onDestroy()
        mPresenter.detachView()
    }

在Presenter中:

    private lateinit var mViewRef: WeakReference<Contact.IView>
    private lateinit var mModel:Contact.IModel
    override fun attachView(view: Contact.IView) {
   
        mViewRef = WeakReference(view)
        mModel = FriendModel()
    }

    override fun detachView() {
   
        mViewRef.clear()
    }

为了避免内存泄漏,这里使用是弱应用
2)数据的交互
View:

override fun setData(friendList: MutableList<FriendInfo>) = runOnUiThread{
   
        mAdaper.setData(friendList)
    }

Presenter:

override fun loadData(token:String) {
   
        val map = HashMap<String
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值