Recycler anzeigen Änderungsdatensatz

Ich möchte Suchfunktionalität für meine RecyclerView implementieren. Bei Text geändert Ich möchte die Daten ändern, die mit diesem Widget angezeigt werden. Vielleicht ist diese Frage schon vorher gefragt oder ist einfach, aber ich weiß nicht, wie die Veränderung die Daten, die angezeigt werden sollen …

Mein RecyclerView ist wie folgt definiert:

  • SQLite Query in nicht case sensitive alphabetische Reihenfolge
  • Wie man das Element in der Tabellenzeile ausrichtet (links - rechts - rechts)
  • Was ist Werkzeuge: Mockup, Werkzeuge: mockup_crop und Werkzeuge: mockup_opacity
  • Android.dexOptions.incremental property ist veraltet
  • Das Symbol 'GoogleCloudMessaging' kann nicht beendet werden
  • Lost appCache von Android 4.4 WebView
  • // 1. get a reference to recyclerView mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView); // 2. set layoutManger mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); // 3. create an adapter mAdapter = new ItemsAdapter(itemsData); // 4. set adapter mRecyclerView.setAdapter(mAdapter); 

    Und die Daten, die ich zeige, sind so:

      ItemData itemsData[] = { new ItemData("Mary Richards"), new ItemData("Tom Brown"), new ItemData("Lucy London") }; 

    Also wann will ich dem Adapter einen anderen Satz von Daten geben, ein anderes Array (zB mit einem Artikel), was soll ich tun?

  • Resize Zeichentabelle in Android
  • Camera2basic app, hat eine sehr dunkle Vorschau in Android 6.0 LGG3
  • Choreograph NullPointerException
  • Wie man das Android-Gerät abwischen kann, wenn das Gerät admin deaktiviert ist?
  • Gradle: 'buildTypes' kann nicht auf groovy.lang.Closure angewendet werden
  • Setze set_column und layout_row in GridLayout programmgesteuert ein
  • 4 Solutions collect form web for “Recycler anzeigen Änderungsdatensatz”

    Wenn Sie stabile ids in Ihrem Adapter haben, können Sie ziemlich gute Ergebnisse (Animationen) erhalten, wenn Sie ein neues Array mit den gefilterten Elementen erstellen und anrufen

     recyclerView.swapAdapter(newAdapter, false); 

    Verwenden von swapAdapter- Tipps RecyclerStellen Sie an, dass es Ansichtshalter wiederverwenden kann. (Vs in setAdapter, muss es alle Ansichten wiederverwerten und neu erstellen, da es nicht weiß, dass der neue Adapter denselben ViewHolder mit dem alten Adapter hat).

    Ein besserer Ansatz würde feststellen, welche Elemente entfernt und benannt werden notifyItemRemoved(index) . Vergessen Sie nicht, das Element zu entfernen. Dies wird es ermöglichen, dass RecyclerView prädiktive Animationen ausführt. Angenommen, Sie haben einen Adapter, der intern eine ArrayList verwendet, die Implementierung würde so aussehen:

     // adapter code final List<ItemData> mItems = new ArrayList(); //contains your items public void filterOut(String filter) { final int size = mItems.size(); for(int i = size - 1; i>= 0; i--) { if (mItems.get(i).test(filter) == false) { mItems.remove(i); notifyItemRemoved(i); } } } 

    Es würde noch besser ausführen, wenn du Batch notifyItemRemoved Anrufe und benutze notifyItemRangeRemoved verwenden notifyItemRangeRemoved . Es würde so aussehen wie: (nicht getestet)

     public void filterOut(String filter) { final int size = mItems.size(); int batchCount = 0; // continuous # of items that are being removed for(int i = size - 1; i>= 0; i--) { if (mItems.get(i).test(filter) == false) { mItems.remove(i); batchCount ++; } else if (batchCount != 0) { // dispatch batch notifyItemRangeRemoved(i + 1, batchCount); batchCount = 0; } } // notify for remaining if (batchCount != 0) { // dispatch remaining notifyItemRangeRemoved(0, batchCount); } } 

    Sie müssen diesen Code erweitern, um Elemente hinzuzufügen, die zuvor gefiltert wurden, aber jetzt sollte sichtbar sein (zB löscht der Benutzer die Filterabfrage), aber ich denke, dieser sollte die Grundidee geben.

    Denken Sie daran, dass jeder Benachrichtigung Artikel Anruf beeinflusst die nach ihm (weshalb ich die Liste von Ende zu überqueren, um es zu vermeiden). Traversing von Ende hilft auch ArrayList's Methode Methode Leistung (weniger Elemente zu verschieben).

    Zum Beispiel, wenn Sie die Liste von Anfang an durchlaufen und entfernen Sie die ersten beiden Elemente. Du solltest entweder anrufen

     notifyItemRangeRemoved(0, 2); // 2 items starting from index 0 

    Oder wenn du sie eins nach dem anderen versende

     notifyItemRemoved(0); notifyItemRemoved(0);//because after the previous one is removed, this item is at position 0 

    Das ist meine Antwort – dank Ivan Skoric von seiner Seite: http://blog.lovelyhq.com/creating-lists-with-recyclerview-in-android/

    Ich habe eine zusätzliche Methode in meiner Adapterklasse erstellt:

     public void updateList(List<Data> data) { mData = data; notifyDataSetChanged(); } 

    Dann jedes Mal, wenn Ihre Daten ändern, rufen Sie einfach diese Methode übergeben in Ihre neuen Daten und Ihre Ansicht sollte ändern, um es zu reflektieren.

    Just neu initialisieren Sie Ihren Adapter:

    MAdapter = new ItemsAdapter (newItemsData);

    Oder wenn Sie nur noch entfernen müssen ein paar bestimmte Elemente anstatt eine ganze Liste:

    MAdapter. NotifyItemInserted (Position);

    oder

    MAdapter.notiftyItemRemoved (Position);

    Wie ygit geantwortet hat, ist swapAdapter interessant, wenn man den ganzen Inhalt ändern muss.

    Aber in meinem FlexibleAdapter können Sie die Elemente mit updateDataSet . Sie können sogar den Adapter konfigurieren, um notifyDataSetChanged oder Synchronisationsanimationen zu haben (standardmäßig aktiviert). Das, weil notifyDataSetChanged alle Animationen tötet, aber es ist gut für große Listen zu haben.

    Bitte beachten Sie die Beschreibung, DemoApp und Wiki Seiten: https://github.com/davideas/FlexibleAdapter

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