标签: ViewModel

请教下 ViewModel 和 Adapter 该如何结合以实现动态加载

如题,我的 ViewModel 类中有一个列表结构的数据,需要动态加载,代码如下:

class TimelineViewModel : ViewModel() {
    val timelines = MutableLiveData<List<TimelineModel>>(emptyList())

    private var nextTime = System.currentTimeMillis()

    fun getTimeline() {
    	viewModelScope.launch {
            try {
                val respData = Repository.getTimeline(nextTime)
                if (respData.data != null) {
                    nextTime = respData.data.feeds.nextTime
                    val timelineModels = respData.data.feeds.data.filterNotNull().map {
                        TimelineModel(it)
                    }
                    timelines.value = timelines.value.let {
                        if (it == null) {
                            timelineModels
                        } else {
                            it + timelineModels
                        }
                    }
                }
            } catch (e: Exception) {
                Log.e(TAG, "Network Request Fail", e)
            }
        }
    }
}
  • 如果在视图层直接使用 MutableLiveData#observe 方法观察这个数据,那么观察到的是整个 List 数据的变化,那么该怎么将其转化为 Adapter 的添加元素的行为?
  • 或者应该怎么处理这种需要修改列表数据的场景?

nexttime

val

viewmodel

lue

3 条回复    2021-08-24 19:57:24 +08:00

omysho
    1

omysho   15 天前 via Android   ❤️ 1

有个东西叫 DiffUtil

还有个东西叫 AsyncListDiffer

还有个东西叫 ListAdapter 继承自 Recycler.Adapter 需要一个 ItemDiffCallback 作为构造参数

pigspy
    2

pigspy   15 天前

@omysho

非常感谢

122006
    3

122006   5 天前

androidx 的 recycleview 自带,直接继承 listadapter 就行

MVC,MVP 和 MVVM 的图示

复杂的软件必须有清晰合理的架构,否则无法开发和维护。

MVC(Model-View-Controller)是*常见的软件架构之一,业界有着广泛应用。它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。

读了《Scaling Isomorphic Javascript Code》后,突然意识到,它们的区别非常简单。我用几段话,就可以说清。

%title插图%num

一、MVC

MVC模式的意思是,软件可以分成三个部分。

%title插图%num

  • 视图(View):用户界面。
  • 控制器(Controller):业务逻辑
  • 模型(Model):数据保存

各部分之间的通信方式如下。

%title插图%num

  1. View 传送指令到 Controller
  2. Controller 完成业务逻辑后,要求 Model 改变状态
  3. Model 将新的数据发送到 View,用户得到反馈

所有通信都是单向的。

二、互动模式

接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。

%title插图%num

另一种是直接通过controller接受指令。

%title插图%num

三、实例:Backbone

实际项目往往采用更灵活的方式,以 Backbone.js 为例。

%title插图%num

1. 用户可以向 View 发送指令(DOM 事件),再由 View 直接要求 Model 改变状态。

2. 用户也可以直接向 Controller 发送指令(改变 URL 触发 hashChange 事件),再由 Controller 发送给 View。

3. Controller 非常薄,只起到路由的作用,而 View 非常厚,业务逻辑都部署在 View。所以,Backbone 索性取消了 Controller,只保留一个 Router(路由器) 。

四、MVP

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

%title插图%num

1. 各部分之间的通信,都是双向的。

2. View 与 Model 不发生联系,都通过 Presenter 传递。

3. View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

五、MVVM

MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。

%title插图%num

唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速