Beste Weg, um Daten mit einem RecyclerView Adapter zu aktualisieren

Wenn ich einen klassischen Adapter mit einem ListView verwenden muss , aktualisiere ich meine Daten in der ListView wie folgt:

myAdapter.swapArray(data); public swapArray(List<Data> data) { clear(); addAll(data); notifyDataSetChanged(); } 

Ich würde gerne wissen, was die beste Praxis für ein RecyclerView ist . Denn in einem RecyclerView- Adapter kannst du kein clear und addAll wie in ListView machen .

  • Lesen Sie die HTML-Datei aus den Assets
  • ActionBarDrawerToggle v7 oder v4?
  • Unzureichende Berechtigungen für das Gerät in Android Studio Workspace, das in openSUSE 13.2 ausgeführt wird
  • 75 Marker auf Karte -> Speicherlecks -> OutOfMemoryException
  • Android AlarmManager nicht aufwachen Telefon oben
  • Android Studio - Gradle Manifest Merging fehlgeschlagen
  • Also habe ich versucht, nur mit einem notifyDataSetChanged , aber es hat nicht funktioniert. Dann habe ich mit einem SwapAdapter aus meiner Sicht versucht:

     List<Data> data = newData; MyRecyclerAdapter adapter = new MyRecyclerAdapter(data); // swapAdapter on my recyclerView (instead of a .setAdapter like with a classic listView). recyclerViewList.swapAdapter(adapter, false); 

    Aber mit dieser letzten Lösung muss ich noch eine neue Instanz von meinem Adapter erstellen und ich fühle mich wie es nicht die beste Lösung ist. Ich sollte nur meine Daten ohne einen neuen MyRecyclerAdapter .

  • Aufnahmen von einer SurfaceView in android
  • Wie kann ich eine benutzerdefinierte Schriftart im Eingabebereich einer Eingabemethode verwenden?
  • Entfernen Sie "Done" -Taste von ActionMode
  • Android EditText Hinweis Größe
  • Android App aus Speicherproblemen - versuchte alles und immer noch mit einem Verlust
  • Wie bekomme ich Telefonkontakte in Android
  • 4 Solutions collect form web for “Beste Weg, um Daten mit einem RecyclerView Adapter zu aktualisieren”

    Der RecyclerView-Adapter kommt nicht mit vielen Methoden, die sonst im ListView-Adapter verfügbar sind. Aber dein Swap kann ganz einfach umgesetzt werden:

     class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { List<Data> data; ... public void swap(ArrayList<Data> datas) { if(datas == null || datas.size()==0) return; if (data != null && data.size()>0) data.clear(); data.addAll(datas); notifyDataSetChanged(); } } 

    Auch gibt es einen Unterschied zwischen

     list.clear(); list.add(data); 

    und

     list = newList; 

    Die erste ist die Wiederverwendung der gleichen Liste Objekt. Die andere ist dieeferenzierung und referenziert die Liste. Das alte Listenobjekt, das nicht mehr erreicht werden kann, wird Müll gesammelt, aber nicht ohne den ersten Haufen Speicher Dies wäre das gleiche wie die Initialisierung neuer Adapter jedes Mal, wenn Sie Daten austauschen möchten.

    @ Inmyth's Antwort ist richtig, nur ändern Sie den Code ein wenig, um leere Liste zu behandeln.

     public class NewsAdapter extends RecyclerView.Adapter<...> { ... private static List mFeedsList; ... public void swap(List list){ if (mFeedsList != null) { mFeedsList.clear(); mFeedsList.addAll(list); } else { mFeedsList = list; } notifyDataSetChanged(); } 

    Ich bin mit Retrofit, um die Liste zu holen, auf Retrofit's onResponse () verwenden,

     adapter.swap(feedList); 

    Gefundene Lösung für mein ähnliches Problem:

     private ExtendedHashMap mData = new ExtendedHashMap(); private String[] mKeys; public void setNewData(ExtendedHashMap data) { mData.putAll(data); mKeys = data.keySet().toArray(new String[data.size()]); notifyDataSetChanged(); } 

    Mit dem Clear-Befehl

     mData.clear() 

    Ist nicht nessescary

    DiffUtil kann die beste Wahl für die Aktualisierung der Daten im RecyclerView Adapter, die Sie im Android-Framework finden können. DiffUtil ist eine Utility-Klasse, die die Differenz zwischen zwei Listen berechnen und eine Liste von Update-Operationen ausgeben kann, die die erste Liste in die zweite umwandelt.

    Die meiste Zeit ändert sich unsere Liste komplett und wir setzen neue Liste auf RecyclerView Adapter. Und wir nennen notifyDataSetChanged, um den Adapter zu aktualisieren. NotifyDataSetChanged ist teuer. DiffUtil Klasse löst dieses Problem jetzt. Es macht seine Arbeit perfekt!

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