10

Podążam za architekturą MVP w mojej aplikacji. My HomeActivity zawiera panel przesuwania z ikoną listy posiadającą selektor, który jest po wybraniu elementu panelu ślizgowego, gdy stan ikony został zmieniony i nie używam żadnego selektora listy.Standard architektury systemu Android MVP do ładowania interfejsu użytkownika z klasą modelu posiadającą zasoby Androida

ja utrzymując model klasy NavItemData do wypełniania nawigacyjnego szufladę i przy użyciu klasy SlidingPanelItemSelector że rozciąga StateListDrawable generuje odpowiedni przełącznik dla przesuwnych ikony panelu.

W architekturze MVP mamy klasę prezentera, która komunikuje się z modelem i generuje dane wejściowe dla widoków. W moim przypadku jeśli używam prezentera do pobierania danych z Panelu Przesuwnego, wzywam klasę od prezentera, który używa kontekstu androidowego, czy to jest dobre podejście, czy też mamy jakieś alternatywne rozwiązanie, które ściśle przestrzega architektury MVP?

Obecnie używam ViewBinderUtils klasę i wstrzykuje bezpośrednio do klasy aktywności i pobiera listę danych do panelu przesuwne. Czy to jest po Mvp Architekcie?

SlidingPanelItemSelector.class

public class SlidingPanelItemSelector extends StateListDrawable { 
    private Context mContext; 

    public SlidingPanelItemSelector(Context mContext){ 
     this.mContext = mContext; 
    } 

    public StateListDrawable getHomeSelector(){ 
    StateListDrawable stateListDrawable = new StateListDrawable(); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, 
       mContext.getDrawable(R.drawable.ic_nav_home_active)); 
      stateListDrawable.addState(new int[]{},mContext.getDrawable(R.drawable.ic_nav_home)); 
     }else{ 
      stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, 
       mContext.getResources().getDrawable(R.drawable.ic_nav_home_active)); 
      stateListDrawable.addState(new int[]{},mContext.getResources().getDrawable(R.drawable.ic_nav_home)); 
     } 

     return stateListDrawable; 
    } 
} 

ViewBinderUtils.class

public class ViewDataBinderUtils { 
    Context mContext; 
    @Inject 
    public ViewDataBinderUtils(@ActivityContext Context mContext) { 
     this.mContext = mContext; 
    } 
    public List<SlidingPanelData> getListData(String [] titles){ 
     List<SlidingPanelData> items = new ArrayList<>(); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getHomeSelector(),titles[0],true)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getConfigurationSelector(),titles[1],false )); 
    items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getConfigurationSelector(),titles[2],false)); 
     items.add(new SlidingPanelData(true)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getQuoteSelector(),titles[3],false)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getEquipmentInventorySelector(),titles[4],false)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getCustomerSelector(),titles[5],false)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getQuoterSelector(),titles[6],false)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getSalesProgramsSelector(),titles[7],false)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getCreditAppsSelector(),titles[8],false)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getRetailOffersSelector(),titles[9],false)); 
     items.add(new SlidingPanelData(true)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getPayOffersSelector(),titles[10],true)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getAlertsSelector(),titles[11],true)); 
     items.add(new SlidingPanelData(true)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getTermofUseSelector(),titles[12],false)); 
     items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getLegalInfoSelector(),titles[11],false)); 
     return items; 
    } 
} 

Odpowiedz

3

Prezenter powinien być odizolowany od kontekstu rzeczy, ponieważ jedynym elementem, który powinien wiedzieć o kontekście jest część View (V). nie dobrze zrozumieć swój cel z tych klas, ale w sposób ogólny należy postępować zgodnie z tą logiką

jeśli używam prezenterowi uzyskania danych do panelu przesuwne jestem wywołanie klasy z prezenterem że korzystając android kontekst

Utwórz interfejs, który jest odpowiedzialny za zarządzanie komunikacją między View (V) z Presenter (P).

Communication.java

public interface Communication { 
    void showLoading(); 
    void hideLoading(); 
    void setSlidingData(String [] titles); 
} 

Państwa zdaniem powinny wdrożyć ten interfejs Comunication i ma odniesienie do Presenter. A jeśli potrzebujesz użyć kontekstu dla Interactor (I), powinieneś mieć klasę, która to zarządza (w moim przypadku RequestHolder).

Wyświetl.java

public View implements Communication{ 
    private Presenter mPresenter; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      // your view already implements the Comunication interface 
      mPresenter = new Presenter(this); 
     } 
     (...) 
     private void getData(){ 
     mPresenter.getData(new RequestHolder(getApplicationContext())); 
     } 

     @Override 
     public void setSlidingData(String [] titles){ 
      List<SlidingPanelData> items = new ArrayList<>(); 
      items.add(new SlidingPanelData(new SlidingPanelItemSelector(getApplicationContext()).getHomeSelector(),titles[0],true)); 
     } 
    } 

w prezenter ma odniesienie do interfejsu

Presenter.java

private Communication mView; 

public Presenter(Communication view) { 
    mView = view; 
} 

/** event to receive data from the model **/ 
public void onEvent(GetDataMessage event){ 
    mView.setSlidingData(event.getData()); 
} 

public void getData(final RequestHolder holder){ 
    new GetDataInteractor(holder); 
} 

RequestHolder.java

// you can put the data important to the interactor 
public RequestHolder(final Context context, int accountId) { 
    super(context); 
} 
//getters and setters 

Z to można uzyskać dostęp do kontekstu wewnątrz swojej interaktora, bez koncepcji mix


W sumie

  • View jest jedynym, który zapewnia kontekst
  • View ma odniesienie do Presenter
  • Prezenter "rozmowy" z widokiem między interfejsem

W konkretnym przypadku, dlaczego nie tworzy się listy, która potrzebuje kontekstu w części widoku i wypełnia elementy listy = nowa ArrayList <>(); w twojej części prezentera? w ten sposób wszystko pozostaje odizolowane

+0

Dziękuję za odpowiedź. Czy muszę wywoływać związane z widokiem rzeczy (widok komunikacji) z klasy prezentera, prawda? – Sunny

+0

Moja klasa modelu ma inny obiekt, który wymaga kontekstu na jego instancję, więc jeśli piszę implementację interaktora od prezentera, który używa kontekstu, to nie jest dobre podejście, prawda? – Sunny

+0

odpowiedź zaktualizowana, daj mi znać, jeśli pomoże :) – rguerra

Powiązane problemy