Android MVP,如何协调多个视图?

Android MVP,如何协调多个视图?,android,mvp,Android,Mvp,我有一个演讲者p。它意味着控制某些类型视图的所有内容V。我有多个这样的视图:V1,V2Vn。与一个视图Vx交互会对其他视图产生影响Vy 协调这一点的最佳方式是什么?演讲者应该互相交谈吗?演示者是否应该引用所有视图 一种方法是演示者p持有视图V和视图V继承V1,V2,…Vn。所有视图容器(片段和活动)中的V都可以访问方法 public interface MainView扩展了BaseView,ErrorView{//V 作废showProducts(@Nullable List products

我有一个演讲者
p
。它意味着控制某些类型视图的所有内容
V
。我有多个这样的视图:
V1
V2
<代码>Vn。与一个视图
Vx
交互会对其他视图产生影响
Vy


协调这一点的最佳方式是什么?演讲者应该互相交谈吗?演示者是否应该引用所有视图

一种方法是演示者
p
持有视图
V
和视图
V
继承
V1
V2
,…
Vn
。所有视图容器(片段和活动)中的
V
都可以访问方法

public interface MainView扩展了BaseView,ErrorView{//V
作废showProducts(@Nullable List products);
} 
公共接口BaseView{//V1
无效设置加载(布尔加载);
无效显示确认对话框(@StringRes int title,@StringRes int message);
}
公共接口错误视图{//V2
无效的snackbar(@StringRes int message);
}
公共类ProductListFragment扩展。。。实现MainView{
}
根据我的经验,除了杂乱无章和空洞的方法之外,这种方法工作得很好,这在可读性方面并不好

将其他演示者的引用保存在主演示者中是可以的,只要您确保它们处于活动状态。这可能导致反模式

另一种方法是分别容纳每个演示者,每个演示者单独使用事件:

@Override
public void showProducts(List<Product> products){
   // do something with products that Presenter1 has dispatched for presenting
   presenter2.doSomethingOnProducts();
}
@覆盖
公共产品(列出产品){
//对Presenter1已发送用于演示的产品执行某些操作
演示者2.doSomethingOnProducts();
}
这是结果相关方之间的无缝沟通


Observer
模式与MVP混合也可以

一个视图应该对其他视图一无所知。视图应仅与其演示者通信。一个演讲者也不应该知道其他演讲者的情况。为了避免演示者聚合使用事件(EventBus、Otto、RxJava主题…。

您能否澄清“查看
V
inherit
V1
V2
,…
Vn
”。V可以跨所有视图容器访问方法。我不确定这里的“inherit”是什么意思。V视图都是相同的,只是在一个更大的视图(图片列表视图)中包含了很多视图@Deal See my edit with minimalistic example snippet。主视图能否与主演示者对话,主演示者与主视图和子/嵌套视图对话。子视图/嵌套视图与自己的演示者对话?您好,嵌套视图是什么意思?XML中的层次结构?逻辑上举个例子。如果屏幕上有多个视图,并且某些视图是逻辑嵌套的,则最好使用平面视图演示器结构,而不使用任何嵌套。让我们看看中的Gmail应用程序屏幕示例。您能指出本例中的嵌套视图吗?此外:特定视图应仅与其演示者交互。如果特定的演示者除了自己的视图之外不与任何视图交互,那就更好了。如果演示者希望在另一个视图中更改smth,则应将此视图的演示者插入(例如,使用事件总线)或通过模型影响到另一个视图。此示例中的收件箱视图具有项目列表。这就是我所说的嵌套视图。每个都应该有一个演示者吗?我想你的意思是这是逻辑层次结构,所以你的建议是在这里使用一个演示者。我想我只是有点矛盾。。。如果我们必须实现“长时间点击时突出显示”的功能,那么我们会觉得,对于每个项目,这种逻辑都应该存在于演示者中,并以某种方式将(可能是侦听器)传达回完整视图以保持总计数。但同时,在这里,通过事件总线从主演示者到项目演示者进行交流会让人感到尴尬。
@Override
public void showProducts(List<Product> products){
   // do something with products that Presenter1 has dispatched for presenting
   presenter2.doSomethingOnProducts();
}