5

Ich schrieb meine eigene Adapter Cursor für RecyclerView wie folgenden Link: https://gist.github.com/skyfishjy/443b7448f59be978bc59Wie zeigen Sie Daten aus der Datenbank in eine RecyclerView mit hoher Leistung?

Dann fand ich, wenn ich etwas in der Datenbank ändern und es in RecyclerView zeigen will, ich brauche einen neuen Cursor durch db.query() und Nutzung erstellen CursorAdpaters changeCursor(). Da query() alle Zeilen in der Datenbank scannt, wird RecyclerView langsam aktualisiert, wenn die Datenmenge groß ist, auch wenn ich nur eine Zeile in die Datenbank einfüge.

Außerdem, wie wir alle wissen, bietet RecyclerView notifyItemInserted/Removed (Position) für Entwickler, so dass der RecyclerView teilweise auffrischen kann, was nützlich und nützlich für Speicher/Zeit ist. Wenn ich jedoch CursorAdapter verwende, weiß ich nicht, wann und wie ich diese Methoden verwenden kann, da das Ändern des Cursors nicht direkt etwas zur Datensatzbindung mit RecyclerView hinzufügt, sondern alle Elemente tatsächlich aktualisiert.

Gibt es also bessere Möglichkeiten, Daten aus der Datenbank in RecyclerView anzuzeigen und die Verbesserungsmethode von RecyclerView zu verwenden, um eine Vielzahl von Datenbanken anzuzeigen?

Antwort

4

Ich kann Ihnen sagen, was ich getan habe ... A. Loaded einen Cursor mit Loader. B. Kopiert den Cursor in Arraylist, die an den Adapter angeschlossen ist (der Cursor ist nicht direkt an den Adapter angeschlossen), schließen Sie den Cursor. Funktioniert gut, wenn es nicht viele Daten gibt - wenn es viele Zeilen gibt, würde ich einiges davon in die Arraylist laden und wenn der Benutzer dann nach unten scrollen würde, würde ich erneut abfragen und von der letzten Zeile des Arrays laden. C. Wenn der Benutzer etwas löschen oder hinzufügen möchte, würde ich die Operation nicht auf Arraylist ersten (UI-Thread) notifiyItemChanged und dann die DB ändern (Zurück Thread) Hoffnung i geholfen.

+0

Ich dachte über die gleichen Gedanken wie Ihre, aber sie sind nicht die besten Methoden. Erstens, CursorLoader wurde entwickelt, um Daten zu aktualisieren, die sich jederzeit ändern können. In meiner Situation weiß ich, wann Daten und UI aktualisiert werden müssen. Wenn ich CursorLoader verwende, wird ein anderer Thread erstellt und somit Ressourcen verschwendet. Zweitens scheint es einfach zu sein, Daten vom Cursor in eine ArrayList zu kopieren, aber es hat das gleiche Problem: Speicherverschwendung, weil die ArrayListe hier nicht benötigt wird ---- Warum sollte ich eine ArrayList verwenden, wenn ein Cursor Daten bereitstellt? Schließlich kann Schritt C einen Fehler verursachen. – ywwynm

+0

Ich werde am Ende beginnen, Schritt c verursacht keinen Fehler, wenn es richtig gemacht wird. Ich habe das Array kopiert, weil ich wollte 'Swipe Do Delete' Feature und ich wirklich wirklich nicht mag todo irgendeine Änderung der DB auf dem Hauptthread. Es ist vielleicht eine Verschwendung von Speicher (vielleicht), aber es ist effizient mit UI-Nutzung. Wieder denke ich, dass ein anderes Array hier und da eine Menge billiger ist als das Löschen einer Zeile in der DB auf der Benutzeroberfläche. – EE66

+0

Ich nehme deinen Rat an. Aber ich dachte über etwas Neues nach: Laden Sie den Cursor, kopieren Sie Daten in eine ArrayList in Activity onCreate() und binden Sie sie an RecyclerView.Adapter. Wenn ich dann die Daten im UI-Thread ändern möchte, aktualisiere ich nur die ArrayList. Am Ende werde ich in activity onStop() alle Daten von arrayList in die Datenbank schreiben (neue hinzufügen, geänderte aktualisieren und existierende beibehalten). Ist es besser? – ywwynm