Android: SortedList mit Duplikaten

8

Ich habe ein paar Probleme mit RecyclerView s SortedList .

Nehmen wir an, ich habe eine sehr einfache Klasse, die nur eine sehr einfache Klasse mit Daten hat:

%Vor%

Nach meinem Verständnis wird die sortierte Liste keine Duplikate enthalten.

Aber wenn ich eine SortedList mit Rückrufen wie folgt habe:

%Vor%

Ich erhalte Dubletten, wenn ich mehrere Elemente mit derselben ID, aber verschiedenen Zeichen hinzufüge.

%Vor%

Ich würde erwarten, dass die Liste den Artikel aktualisiert. Stattdessen habe ich jetzt mehrere Elemente, obwohl areItemsTheSame true zurückgegeben hat.

    
Paul Woitaschek 06.08.2015, 10:42
quelle

5 Antworten

8

SortedList behält keine Zuordnung durch IDs bei (da es in der API keine IDs gibt). Wenn sich das Sortierkriterium also ändert (a bis b in Ihrem Fall), kann SortedList das vorhandene Element nicht finden.

Sie können das ID-Mapping selbst behalten und haben dann Ihre add-Methode wie folgt:

%Vor%

Sie müssen außerdem eine remove-Methode implementieren, um das Element aus der idMap zu entfernen.

    
yigit 07.08.2015 09:59
quelle
2

Wie Minhtdh bereits in seiner Antwort erwähnt hat, liegt das Problem in Ihrem compare() .

Siehe add() sucht den Index des vorhandenen Objekts mit dem von Ihnen implementierten compare() ab. Wenn Ihr compare() also etwas anderes als 0 zurückgibt, fügt es das Objekt zur Liste hinzu.

Sie müssen überprüfen, ob die Elemente identisch sind, bevor Sie den Inhalt vergleichen. Wenn Ihr Inhalt jedoch identisch sein kann, benötigen Sie einen sekundären Vergleich.

So würde ich das compare() in Ihrem Fall implementieren:

%Vor%     
robocab 19.08.2015 09:31
quelle
0

Ich denke, Sie sollten Integer.compare(o1.id, o2.id); in compare method verwenden, wo SortList entscheidet, ob diese 2 Elemente gleich sind oder nicht.

    
Minhtdh 06.08.2015 11:24
quelle
0

Sie können überprüfen, ob das Objekt bereits in der sortierten Liste vorhanden ist.

%Vor%     
gienapps 21.10.2017 03:54
quelle
-1

In Java ist eine Sammlung, die keine doppelten Elemente enthält, gesetzt . Die gebräuchlichen Implementierungsklassen sind HashSet und Baumsatz . Sie irren sich, wenn Sie davon ausgehen, dass SortedList das tut.

    
Boris 06.08.2015 10:58
quelle