13

Ich möchte einen Umschalter verwenden, um zwischen zwei verschiedenen Ansichten umzuschalten, aber mit demselben RecyclerView. Grundsätzlich möchte ich, dass der RecyclerView-Adapter onCreateViewHolder aufrufen soll, aber dieses Mal wird eine andere Layout-Elementdatei verwendet. Würde notifydatasetchanged() dazu führen, dass der Adapter sich selbst neu erstellt? Oder gibt es einen anderen Weg?Do notifydatasetchanged onCreateViewHolder aufrufen, wenn RecyclerView verwendet wird

Vielen Dank im Voraus.

+0

ein Weg, um herauszufinden, ist einfach 'Log's innen' OnCreateViewHolder' und überprüfen Sie, ob sie auf 'notifydatasetchanged()' aufgerufen werden ... ': P' ist das so schwer? – SMR

+0

Fair genug, aber ich möchte tatsächlich wissen, was der Prozess ist. Ich habe versucht, es nachzuschlagen. Auch das war nicht meine einzige Frage. Entschuldigung, ich fragte – AmaJayJB

+0

Keine Sorge, wenn Sie eine andere Frage haben dann entweder diese Frage bearbeiten oder löschen Sie diese Frage und eine neue Frage '') '. Vielleicht möchtest du [this] lesen (http://stackoverflow.com/help/how-to-ask) – SMR

Antwort

18
nennen könnte

Ich musste zwei Typen aufhabens auf meinem RecyclerViewAdapter auch, eine für "normalen" Modus und eine für Multi-Select-Modus.

So können Sie getItemViewType außer Kraft setzen den Adapter zu zwingen, Ihre onCreateViewHolder für alle Ansichten zu nennen.

Fügen Sie diese auf dem Adapter Code:

public void setActionMode(ActionMode actionMode) { 
    this.actionMode = actionMode; 
    notifyDataSetChanged(); 
} 

@Override 
public int getItemViewType(int position) { 
    return (actionMode == null ? 0 : 1); 
} 

hinzufügen Zu den ViewHolder:

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view; 
    if (viewType == 0) { 
     view = inflater.inflate(R.layout.layout_1, parent, false); 
    } else { 
     view = inflater.inflate(R.layout.layout_2, parent, false); 
    } 
    ... 
} 

Da Sie eine andere ViewType wenn sie in einer ActionMode zurückkehren, wird der Adapter alle werfen weggedrückt erstellte Ansichten und erstellen Sie alles erneut.

+0

Omg das funktioniert. Nur durch Überschreiben von getItemViewType, auch wenn wir den actionMode direkt in onCreateViewHolder verwenden können, erzwingt der Adapter den Aufruf vonCreateViewHolder, wie Sie sagten. Vielen Dank! – Bruce

0

Ja, es wird davon ausgegangen, dass der aktuelle Datensatz ungültig ist und alle Layouts neu verteilt und erneut gebunden werden müssen.

+2

Nein, es scheint, dass es nur den onBindViewHolder aufruft, wenn das notifydatasetchanged() aufgerufen wird. Danke, dass du versucht hast zu helfen. – AmaJayJB

+0

Kein Problem, danke, es gibt immer 20 Möglichkeiten, um ein Ergebnis zu erzielen, nur wählen, welches :) –

+0

Haha, ich möchte nur eine bitte: P – AmaJayJB

2

zu entfernen und zu aktualisieren Layout in RecyclerView Sie

mRecyclerView.removeView(view); 

oder

mRecyclerView.removeViewAt(position); 

nach onBindViewHolder() Objekt im Dataset

3

notifyDataSetChanged() aufrufen zu entfernen, wenn mit RecyclerView