在 MVP 结构中 class 负责保留列表项以及如何通知此中的数据更改
In MVP structure which class responsible for keep list items and how to notify data change in this
我试图重构我的 activity class 之一来实现 mvp(使用 mvp mosby 库)。我有一个 RecyclerView 并且在这个视图中有一些项目在 运行 时间内应用了一些更改。例如,我做了一些 I/O 操作并更改了一行。
我觉得把我的东西放在presenter里比较好class;这方面的最佳做法是什么?将其保留在 1)presenter 或 2)activity 或 3)only keep view related item in adapter and all other item in presenter.
activity 现在直接保留项目并更改 activity 中的项目行,然后通知适配器。在适配器中移动所有这些行并在适配器 class 中通知适配器不是更好吗?例如,我想要更改一些 row.where 的图标,而 class 负责吗?适配器? activity?现在我想在适配器中像这样实现它:
changeItemIcon(int position, int iconRes){
mImages.get(position).setICon(iconRes);
notifyItemChanged(position);
}
我在 activity 上调用此方法并从演示者调用 activity 方法。
好看吗?这样做的最佳做法是什么?
更新
我还发现这个问题 () 使用适配器方法更改项目。但是修改呢?我需要参考我的 activity 中的项目吗?
我从未使用过 mosby,但我刚刚阅读了他们的文档(顺便说一句,读得很好),这是我的理解:
回收器视图通常由视图(android 术语)和适配器组成。两者都在片段或 activity 内连接。就 MVP/mosby 而言,这都是视图层。演示者应该只从你的服务中检索和传递要显示的数据(mosby 中的模型层,"service layer" 或 "business logic" 在其他概念中),然后从 DAO 或存储库中获取它(模型层)。
文档说演示者只处理视图状态,而不处理实际内容。您所在的州是 "showing list".
for example i want change icon of some row.where and which class is responsible for that? adapter? activity?
我知道这听起来有点奇怪,但更改元素始终是您 "business logic" 的责任,即使只是 "icons".
工作流程应该如下(单向数据流):
- 查看出现,告诉演示者加载项目列表
- 演示者从 "business logic" 加载项目并将自己注册为
observer / listener / callback(随便你怎么称呼)
- Presenter 收到结果并告诉视图显示列表
项目(通过 RecyclerView 和相应的适配器)。
到目前为止,我猜你已经实现了,现在到了你想要更改项目的地步。
- 用户点击 RecyclerView 中的某个项目,然后应触发更改该项目的图标。因此 View 应该调用:
presenter.changeItem()
- 在这种情况下,Presenter 只是中间人,它将调用 "business logic layer" 来告知该项目应更改为新状态(图标已更改)。
- "Business logic layer" 将更改模型状态(更改项目图标),然后通知其观察者/听众模型已更改。
- 由于 Presenter 仍在观察/侦听业务逻辑层(请参阅第 2 点),Presenter 将收到通知(请参阅第 6 点)新的(更新的)项目列表,其中包含图标具有的更新项目已更改。
- 类似于第3点。Presenter会告诉视图显示新的(更新的)项目列表(通过RecyclerView和相应的适配器)。
看到单向数据流了吗?这是非常重要的。不变性 FTW.
MVP 有两种不同的变体:被动视图和监督控制器。根据您的喜好,您可以在您的应用中坚持使用其中一种,也可以混合使用两种。
如果选择Passive View,需要在View中隐藏Model,让Presenter格式化数据,然后设置到View中。在这种情况下,您需要在 Presenter 中保留模型引用。 View 应该只保存视图数据(适配器)用于显示目的。
如果坚持使用Supervising Controller,可以让View直接绑定Model的数据,让Model做一些简单的逻辑。 Presenter 应该只关心复杂的逻辑,即一些需要涉及服务的操作。在这种情况下,您可以将模型(您的项目)交给视图(activity)并让它以某种简单的方式与模型交互。
PS:另请查看我们新的 MVP 框架:http://robo-creative.github.io/mvp 上的 Robo MVP。
我试图重构我的 activity class 之一来实现 mvp(使用 mvp mosby 库)。我有一个 RecyclerView 并且在这个视图中有一些项目在 运行 时间内应用了一些更改。例如,我做了一些 I/O 操作并更改了一行。
我觉得把我的东西放在presenter里比较好class;这方面的最佳做法是什么?将其保留在 1)presenter 或 2)activity 或 3)only keep view related item in adapter and all other item in presenter.
activity 现在直接保留项目并更改 activity 中的项目行,然后通知适配器。在适配器中移动所有这些行并在适配器 class 中通知适配器不是更好吗?例如,我想要更改一些 row.where 的图标,而 class 负责吗?适配器? activity?现在我想在适配器中像这样实现它:
changeItemIcon(int position, int iconRes){
mImages.get(position).setICon(iconRes);
notifyItemChanged(position);
}
我在 activity 上调用此方法并从演示者调用 activity 方法。
好看吗?这样做的最佳做法是什么?
更新
我还发现这个问题 (
我从未使用过 mosby,但我刚刚阅读了他们的文档(顺便说一句,读得很好),这是我的理解:
回收器视图通常由视图(android 术语)和适配器组成。两者都在片段或 activity 内连接。就 MVP/mosby 而言,这都是视图层。演示者应该只从你的服务中检索和传递要显示的数据(mosby 中的模型层,"service layer" 或 "business logic" 在其他概念中),然后从 DAO 或存储库中获取它(模型层)。
文档说演示者只处理视图状态,而不处理实际内容。您所在的州是 "showing list".
for example i want change icon of some row.where and which class is responsible for that? adapter? activity?
我知道这听起来有点奇怪,但更改元素始终是您 "business logic" 的责任,即使只是 "icons".
工作流程应该如下(单向数据流):
- 查看出现,告诉演示者加载项目列表
- 演示者从 "business logic" 加载项目并将自己注册为 observer / listener / callback(随便你怎么称呼)
- Presenter 收到结果并告诉视图显示列表 项目(通过 RecyclerView 和相应的适配器)。
到目前为止,我猜你已经实现了,现在到了你想要更改项目的地步。
- 用户点击 RecyclerView 中的某个项目,然后应触发更改该项目的图标。因此 View 应该调用:
presenter.changeItem()
- 在这种情况下,Presenter 只是中间人,它将调用 "business logic layer" 来告知该项目应更改为新状态(图标已更改)。
- "Business logic layer" 将更改模型状态(更改项目图标),然后通知其观察者/听众模型已更改。
- 由于 Presenter 仍在观察/侦听业务逻辑层(请参阅第 2 点),Presenter 将收到通知(请参阅第 6 点)新的(更新的)项目列表,其中包含图标具有的更新项目已更改。
- 类似于第3点。Presenter会告诉视图显示新的(更新的)项目列表(通过RecyclerView和相应的适配器)。
看到单向数据流了吗?这是非常重要的。不变性 FTW.
MVP 有两种不同的变体:被动视图和监督控制器。根据您的喜好,您可以在您的应用中坚持使用其中一种,也可以混合使用两种。
如果选择Passive View,需要在View中隐藏Model,让Presenter格式化数据,然后设置到View中。在这种情况下,您需要在 Presenter 中保留模型引用。 View 应该只保存视图数据(适配器)用于显示目的。
如果坚持使用Supervising Controller,可以让View直接绑定Model的数据,让Model做一些简单的逻辑。 Presenter 应该只关心复杂的逻辑,即一些需要涉及服务的操作。在这种情况下,您可以将模型(您的项目)交给视图(activity)并让它以某种简单的方式与模型交互。
PS:另请查看我们新的 MVP 框架:http://robo-creative.github.io/mvp 上的 Robo MVP。