2016-10-03 57 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請參閱我的編輯與簡約的示例片段。 –