Android: SortedList mit Duplikaten

Ich habe einige Probleme Verständnis RecyclerView s SortedList .

Lets sagen, ich habe eine sehr einfache Klasse nur mit einer sehr einfachen Klasse halten Daten:

 public class Pojo { public final int id; public final char aChar; public Pojo(int id, char aChar) { this.id = id; this.aChar = aChar; } @Override public String toString() { return "Pojo[" + "id=" + id + ",aChar=" + aChar + "]"; } } 

Mein Verständnis ist, dass die sortierte Liste keine Duplikate enthält.

Aber wenn ich eine SortedList mit Callbacks wie folgt habe:

 .... @Override public boolean areContentsTheSame(Pojo oldItem, Pojo newItem) { return oldItem.aChar == newItem.aChar; } @Override public int compare(Pojo o1, Pojo o2) { return Character.compare(o1.aChar, o2.aChar); } @Override public boolean areItemsTheSame(Pojo item1, Pojo item2) { return item1.id == item2.id; } 

Ich am Ende mit Duplikaten, wenn ich mehrere Elemente mit der gleichen ID aber verschiedene Zeichen hinzufügen.

 sortedList.add(new Pojo(1, 'a')); sortedList.add(new Pojo(1, 'b')); 

Ich würde erwarten, dass die Liste das Element aktualisiert. Stattdessen habe ich jetzt mehrere Artikel, obwohl areItemsTheSame true .

  • Was ist die SortedList <T> mit RecyclerView.Adapter?
  • Wie sortiere ich Datum in absteigender Reihenfolge Von Arraylist Datum in android?
  • 4 Solutions collect form web for “Android: SortedList mit Duplikaten”

    SortedList hält keine Zuordnung durch IDs (da es keine IDs in der API gibt). Wenn also die Sortierkriterien sich ändern (a bis b in deinem Fall), kann SortedList das vorhandene Element nicht finden.

    Sie können die ID-Mapping selbst behalten, dann haben Sie Ihre Add-Methode wie folgt:

     void add(Item t) { Item existing = idMap.get(t.id); if (existing == null) { sortedList.add(t); } else { sortedList.updateItemAt(sortedList.indexOf(existing), t); } idMap.put(t.id, t); } 

    Sie müssen auch eine Remove-Methode implementieren, um das Element aus dem idMap zu entfernen.

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

    Sehen Sie, add() sucht den vorhandenen Objekt-Index mit dem compare() Sie implementieren. Wenn also Ihr compare() etwas anderes als 0 zurückgibt, fügt es das Objekt zur Liste hinzu.

    Sie müssten überprüfen, ob die Gegenstände gleich sind, bevor sie den Inhalt vergleichen. Allerdings, wenn Ihr Inhalt das gleiche sein könnte, benötigen Sie einen sekundären Vergleich.

    So würde ich den compare() in deinem Fall implementieren:

     @Override public int compare(Pojo o1, Pojo o2) { int result; if (areItemsTheSame(o1, o2) { result = 0; } else { result = Character.compare(o1.aChar, o2.aChar); if (result == 0) { // TODO implement a secondary comparison } } return result; } 

    Ich denke, du solltest Integer.compare(o1.id, o2.id); Im compare Methode, es ist, wo SortList entscheiden, die 2 Elemente sind die gleichen oder nicht.

    In Java ist eine Sammlung, die keine doppelten Elemente enthält, gesetzt . Die üblichen Implementierungsklassen sind HashSet und TreeSet . Sie sind falsch, dass SortedList das tut.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.