2016-10-03 75 views
2

我有一个主持人P。它意味着控制某些类型的视图的所有内容V。我有这样的多个意见:V1,V2,... Vn。与一个视图Vx交互,可以对其他视图产生影响VyAndroid MVP,如何协调多个视图?

协调此问题的最佳方法是什么?演讲者是否应该相互交谈?演示者是否应该引用所有视图?

回答

4

One View应该对其他的一无所知。该视图只能与其演示者进行交流。一位演示者也不应该知道其他演示者。避免演讲者凝聚力使用事件(EventBus,Otto,RxJava主题...)。

+0

主视图是否可以与主视图对话,主视图会与主视图和子视图/嵌套视图进行对话。子/嵌套视图与他们自己的演示者交谈? – Deal

+1

你好,你是什么意思的嵌套视图?在XML中分层次?按道理?举个例子。如果您在屏幕上有多个视图并且某些视图在逻辑上嵌套,则最好使用平面视图 - 演示者结构而不进行任何嵌套。让我们看看[本文](http://hannesdorfmann.com/mosby/mvp/)中的Gmail应用程序屏幕示例。你能指出在这个例子中的嵌套视图吗? – Torbik

+0

此外:特定视图只能与其演示者交互。如果特定的Presenter不与除View之外的任何View进行交互,则会更好。如果演示者想在另一个视图中更改视图,则应该通过该模型戳此视图的演示者(例如,使用事件总线)或影响另一个视图。 – Torbik

1

一种方法是主持人P控股视图V和查看V继承V1V2,... Vn。跨所有视图容器(片段和活动),方法将可访问V

public interface MainView extends BaseView, ErrorView{ //V 
    void showProducts(@Nullable List<Product> products); 
} 


public interface BaseView{ //V1 
    void setLoading(boolean loading); 
    void showConfirmationDialog(@StringRes int title, @StringRes int message); 
} 

public interface ErrorView{ //V2 
    void showErrorSnackBar(@StringRes int message); 
} 


public class ProductListFragment extends ... implements MainView{ 


} 

根据我的经验,这工作得很好,杂波和空的方法,这是不是在可读性方面的良好旁边。

只要确保他们活着,在主要演示者内部保持其他演示者的引用就没有问题。这可能导致反模式。

另一种方法是单独保持每个演示者和他们每个人的消耗事件独立位置:

@Override 
public void showProducts(List<Product> products){ 
    // do something with products that Presenter1 has dispatched for presenting 
    presenter2.doSomethingOnProducts(); 
} 

这是在结果中的感兴趣的各方之间的无缝通信。

混合Observer模式与MVP也很好。

+0

你能澄清一下 “view'V'继承'V1','V2',...'Vn'。所有View容器都可以访问V的方法。 我不确定我是否遵循'继承'的含义。 V视图都是同一时间,只是有很多包含在一个更大的视图(图片列表视图) – Deal

+0

@Deal请参阅我的编辑与简约的示例片段。 –