Ich versuche, ein bestimmtes Element in zu aktualisieren RecyclerView
.
Story: Immer wenn ein Benutzer auf ein Element klickt, wird es angezeigt AlertDialog
. Der Benutzer kann Text eingeben, indem er auf die Schaltfläche OK klickt. Ich möchte diesen Text in diesem Artikel anzeigen und unsichtbar anzeigen ImageView
- in XML und Adapter deklariert ViewHolder
-
Ich habe diese Funktion in der AlertDialog
positiven Schaltfläche verwendet, um das Element zu aktualisieren:
private void updateListItem(int position) {
View view = layoutManager.findViewByPosition(position);
ImageView medicineSelected = (ImageView) view.findViewById(R.id.medicine_selected);
medicineSelected.setVisibility(View.VISIBLE);
TextView orderQuantity = (TextView) view.findViewById(R.id.order_quantity);
orderQuantity.setVisibility(View.VISIBLE);
orderQuantity.setText(quantity + " packet added!");
medicinesArrayAdapter.notifyItemChanged(position);
}
Dieser Code ändert jedoch nicht nur die itemView an der übergebenen Position, sondern auch einige andere itemViews!
Wie soll ich eine bestimmte itemView korrekt ändern, indem ich darauf klicke?
onBindViewHolder()
Einzelne Elemente aktualisieren
notifyItemChanged(updateIndex)
Beispiel
Ändern Sie das Element "Schafe" so, dass "Ich mag Schafe" angezeigt wird.
Meine vollständige Antwort mit weiteren Beispielen finden Sie hier .
quelle
Fügen Sie den geänderten Text Ihrer Modelldatenliste hinzu
quelle
Ich glaube, ich habe eine Idee, wie ich damit umgehen soll. Das Aktualisieren entspricht dem Löschen und Ersetzen an der genauen Position. Also entferne ich zuerst den Gegenstand von dieser Position mit dem folgenden Code:
und dann würde ich den Artikel an dieser bestimmten Position hinzufügen, wie unten gezeigt:
Ich versuche das jetzt umzusetzen. Ich würde dir ein Feedback geben, wenn ich fertig bin!
quelle
Ich musste dieses Problem lösen, indem ich die Position des zu ändernden Elements und dann den Adapteraufruf abfing
Dadurch wird onBindViewHolder (ViewHolder-Inhaber, int-Position) für dieses bestimmte Element an dieser bestimmten Position aufgerufen.
quelle
Die folgende Lösung hat bei mir funktioniert:
Bei einem RecyclerView-Element klickt der Benutzer auf eine Schaltfläche, aber eine andere Ansicht wie TextView wird aktualisiert, ohne den Adapter direkt zu benachrichtigen:
Ich habe eine gute Lösung dafür gefunden, ohne die notifyDataSetChanged () -Methode zu verwenden. Diese Methode lädt alle Daten von recyclerView neu. Wenn Sie also Bilder oder Videos in einem Element haben, werden diese neu geladen und die Benutzererfahrung ist nicht gut:
Hier ist ein Beispiel für das Klicken auf ein ImageView-ähnliches Symbol und das Aktualisieren nur einer einzelnen TextView (es ist möglich, mehr Ansichten auf dieselbe Weise wie bei demselben Element zu aktualisieren), um nach dem Hinzufügen von +1 die Aktualisierung der Anzahl anzuzeigen:
quelle
Eine Möglichkeit, die für mich persönlich funktioniert hat, ist die Verwendung der Adaptermethoden von recyclerview, um mit Änderungen an den Elementen umzugehen.
In ähnlicher Weise würde es eine Methode erstellen, die in der Ansicht Ihres benutzerdefinierten Recyclers ungefähr so aussieht:
quelle
Setzen Sie in Ihrer Adapterklasse in der onBindViewHolder-Methode ViewHolder wie im folgenden Code auf setIsRecyclable (false).
quelle
Sie müssen nur den folgenden Code im Warnungsdialogfeld beim Klicken zum Speichern hinzufügen
quelle
Das Problem ist,
RecyclerView.Adatper
dass keine Methoden bereitgestellt werden, die den Index des Elements zurückgebenMeine Problemumgehung besteht darin, eine Karteninstanz für (Element, Position) s zu erstellen
Friend
) sollte implementiert werdenhashCode()
undequals()
weil er der Schlüssel in der Hashmap ist.wenn sich ein Element ändert,
Es ist gut, eine Hilfsmethode zu definieren
Map instance (
Map<Friend, Integer> posMap
) ist nicht unbedingt erforderlich. Wenn map nicht verwendet wird, kann durch Schleifen in der gesamten Liste die Position eines Elements ermittelt werden.quelle
Das ist auch mein letztes Problem. Hier meine Lösung Ich verwende Datenmodell und Adapter für meine RecyclerView
quelle
Wenn Sie ein Objekt erstellen und es der Liste hinzufügen, die Sie in Ihrem Adapter verwenden, ändern sich beim Ändern eines Elements Ihrer Liste im Adapter auch alle anderen Elemente. Mit anderen Worten, es geht nur um Referenzen und Ihre Liste nicht Halten Sie separate Kopien dieses einzelnen Objekts.
quelle
In Ihrem RecyclerView-Adapter sollten Sie eine ArrayList sowie eine Methode
addItemsToList(items)
zum Hinzufügen von Listenelementen zur ArrayList haben. Anschließend können Sie Listenelemente durchadapter.addItemsToList(items)
dynamischen Aufruf hinzufügen . Nachdem alle Ihre Listenelemente zur ArrayList hinzugefügt wurden, können Sie aufrufenadapter.notifyDataSetChanged()
, um Ihre Liste anzuzeigen.Sie können die
notifyDataSetChanged
im Adapter für die RecyclerView verwendenquelle