2016-06-23 23 views
4

Momentan habe ich es so, dass ein Adapter einen Verweis auf alle darin enthaltenen Modelle hat. Aber ist es besser, wenn der Moderator die Modelle einfach hält und der Adapter sie einfach referenzieren kann?In dem MVP-Muster, sollten Adapter Modelle halten oder sollte der Moderator Modelle halten und den Adapter darauf verweisen lassen?

So zum Beispiel:

public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ 

private Presenter presenter; 

public Adapter(Presenter presenter){ 
    this. presenter = presenter; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    Model m = presenter.getModels().get(position); 
    // bind model to view holder 
} 

@Override 
public int getItemCount() { 
    return presenter.getModels().size(); 
} 


} 

diese Weise, wenn ein Moderator mehr Modelle abruft, ruft sie einfach nur getAdapter().notfiyDataSetChanged(); nach dem Abruf.

Antwort

4

Sie können wirklich so oder so gehen. Einige würden sagen, den Adapter als Teil Ihrer Ansicht behandeln und es so dumm wie möglich machen, aber es ist definitiv ein Vorteil, den Adapter die Daten halten zu lassen, wenn Sie es richtig machen.

Zum Beispiel verwende ich einen abstrakten Basisadapter mit Generika, der eine Liste von Datenobjekten enthält, um die Recyclerview zu steuern. Es bietet alle standardmäßigen CRUD-Operationen für die Liste (hinzufügen, aktualisieren, löschen, verschieben usw.). Diese Methoden behandeln auch den Adapter der Änderung, sodass sich mein Client-Code nicht darum kümmern muss. Es übergibt einfach ein Objekt an den Adapter oder weist ihn an, einen zu löschen/zu ändern und der Adapter erledigt den Rest.

Der große Vorteil hier ist eine enorme Verringerung der Anzahl von wiederholten Standardcode für CRUD-Operationen und Datensatzänderungen Benachrichtigungen über die verschiedenen Akteure mit Recyclerviews interagieren. Wenn Sie mehr als ein oder zwei Bildschirme mit Recycler-Ansichten haben, summiert sich diese Ersparnis schnell, um es vorteilhafter zu machen, als sich blind an ein Mantra zu halten.

+0

Ah ich verstehe. Haben Sie Beispiele für den abstrahierten Adapter? Und wenn ich nicht den abstrahierten Adapterweg gehen würde, würde ich sagen, ich sollte den Moderator die Modelle halten lassen? – Sree

3

Normalerweise wird der Adapter als Implementierungsdetail von View betrachtet.

Presenter sollte nicht wissen Implementierungsdetails anzeigen.

Die Aufgabe des Adapters besteht darin, ein Array von Elementen aufzunehmen und in Ansichten zu veröffentlichen. Adapter sollte nicht wissen, über Presenter, Modelle, andere Ansichten etc.

Datenfluss für Adapter, wie ich es verstehe:

Modell -> Presenter -> Ansicht -> Adapter-> ItemView

Kontrolle Strömung ist entgegengesetzter, vorzugsweise überspringender Adapter.

Fühlen Sie sich frei, Fragen in den Projektfragen zu stellen.

+0

Wenn ein Adapter und Presenter kommunizieren müssen, was soll ich tun? Zum Beispiel, wenn es eine Liste von Fotos ist und ein Benutzer ein Foto mag. Muss ich eine Methode in View implementieren, nur um als Mittelsmann zu agieren? Alles, was die View tun würde, wäre 'getPresenter(). LikePhoto();' – Sree

+0

In diesem Fall würde ich ein Lambda innerhalb View verwenden, um das onClick-Ereignis von ItemView zu Presenter zu übertragen. – konmik

+0

hmm .. hast du ein beispiel wie das aussehen würde? Ich bin nicht super vertraut mit Lamdas ... aber selbst mit der Lamda, was passiert, wenn dergleichen fehlschlägt (Gerät ist offline oder Serverfehler)? Wir müssen im Gegensatz zum Foto. – Sree