Wie aktualisiere ich RecyclerView Adapterdaten?

273

Ich versuche herauszufinden, wo das Problem beim Aktualisieren RecyclerViewdes Adapters liegt.

Nachdem ich eine neue Produktliste erhalten hatte, versuchte ich:

  1. Aktualisieren Sie das ArrayListaus dem Fragment, in dem recyclerViewes erstellt wurde, setzen Sie neue Daten auf den Adapter und rufen Sie dann auf adapter.notifyDataSetChanged(). Es hat nicht funktioniert.

  2. Erstellen Sie einen neuen Adapter, wie andere es getan haben, und es hat für sie funktioniert, aber für mich keine Änderung: recyclerView.setAdapter(new RecyclerViewAdapter(newArrayList))

  3. Erstellen Sie eine Methode, mit Adapterder die Daten wie folgt aktualisiert werden:

    public void updateData(ArrayList<ViewModel> viewModels) {
       items.clear();
       items.addAll(viewModels);
       notifyDataSetChanged();
    }
    

    Dann rufe ich diese Methode auf, wenn ich die Datenliste aktualisieren möchte. Es hat nicht funktioniert.

  4. So überprüfen Sie, ob ich die recyclerView auf irgendeine Weise ändern kann, und ich habe versucht, mindestens ein Element zu entfernen:

     public void removeItem(int position) {
        items.remove(position);
        notifyItemRemoved(position);
    }
    

    Alles blieb wie es war.

Hier ist mein Adapter:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> implements View.OnClickListener {

    private ArrayList<ViewModel> items;
    private OnItemClickListener onItemClickListener;

    public RecyclerViewAdapter(ArrayList<ViewModel> items) {
        this.items = items;
    }


    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler, parent, false);
        v.setOnClickListener(this);
        return new ViewHolder(v);
    }

    public void updateData(ArrayList<ViewModel> viewModels) {
        items.clear();
        items.addAll(viewModels);
        notifyDataSetChanged();
    }
    public void addItem(int position, ViewModel viewModel) {
        items.add(position, viewModel);
        notifyItemInserted(position);
    }

    public void removeItem(int position) {
        items.remove(position);
        notifyItemRemoved(position);
    }



    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        ViewModel item = items.get(position);
        holder.title.setText(item.getTitle());
        Picasso.with(holder.image.getContext()).load(item.getImage()).into(holder.image);
        holder.price.setText(item.getPrice());
        holder.credit.setText(item.getCredit());
        holder.description.setText(item.getDescription());

        holder.itemView.setTag(item);
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    @Override
    public void onClick(final View v) {
        // Give some time to the ripple to finish the effect
        if (onItemClickListener != null) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    onItemClickListener.onItemClick(v, (ViewModel) v.getTag());
                }
            }, 0);
        }
    }

    protected static class ViewHolder extends RecyclerView.ViewHolder {
        public ImageView image;
        public TextView price, credit, title, description;

        public ViewHolder(View itemView) {
            super(itemView);
            image = (ImageView) itemView.findViewById(R.id.image);
            price = (TextView) itemView.findViewById(R.id.price);
            credit = (TextView) itemView.findViewById(R.id.credit);
            title = (TextView) itemView.findViewById(R.id.title);
            description = (TextView) itemView.findViewById(R.id.description);
        }
    }

    public interface OnItemClickListener {

        void onItemClick(View view, ViewModel viewModel);

    }
}

Und ich initiiere RecyclerViewwie folgt:

recyclerView = (RecyclerView) view.findViewById(R.id.recycler);
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 5));
adapter = new RecyclerViewAdapter(items);
adapter.setOnItemClickListener(this);
recyclerView.setAdapter(adapter);

Wie aktualisiere ich die Adapterdaten, um neu empfangene Elemente anzuzeigen?


Update: Das Problem war, dass das Layout, in dem gridView angezeigt wurde, wie folgt aussah:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:tag="catalog_fragment"
    android:layout_height="match_parent">

    <FrameLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"/>

        <ImageButton
            android:id="@+id/fab"
            android:layout_gravity="top|end"
            style="@style/FabStyle"/>

    </FrameLayout>
</LinearLayout>

Dann habe ich einfach entfernt LinearLayoutund FrameLayoutals übergeordnetes Layout erstellt.

Filip Luchianenco
quelle
items.clear(); items.addAll(newItems);ist ein hässliches Muster. Wenn Sie hier wirklich defensives Kopieren brauchen, items = new ArrayList(newItems);wäre das weniger hässlich.
Miha_x64
2
@ miha-x64 Du hast recht - es wäre weniger hässlich. Das Problem ist, dass dies einfach nicht funktioniert. Der Adapter erhält keinen Verweis auf den Verweis. Es erhält die Referenz selbst. Wenn Sie also ein neues Dataset erstellen, hat es eine neue Referenz, während der Adapter nur die alte kennt.
Der unglaubliche

Antworten:

325

Ich arbeite mit RecyclerView und sowohl das Entfernen als auch das Aktualisieren funktionieren gut.

1) ENTFERNEN: Es gibt 4 Schritte, um ein Element aus einer RecyclerView zu entfernen

list.remove(position);
recycler.removeViewAt(position);
mAdapter.notifyItemRemoved(position);                 
mAdapter.notifyItemRangeChanged(position, list.size());

Diese Codezeile funktioniert für mich.

2) AKTUALISIEREN DER DATEN: Das einzige, was ich tun musste, ist

mAdapter.notifyDataSetChanged();

All dies mussten Sie im Actvity / Fragment-Code tun, nicht im RecyclerView Adapter-Code.

Niccolò Passolunghi
quelle
2
Danke dir. Bitte überprüfen Sie das Update. Irgendwie lässt das lineare Layout die RecylerView-Aktualisierungsliste nicht zu.
Filip Luchianenco
40
Sie brauchen nur diese beiden Zeilen: list.remove (position); mAdapter.notifyItemRemoved (Position);
Feisal
3
Für mich waren die Linien recycler.removeViewAt(position);(oder besser gesagt recycler.removeAllViews()) die entscheidenden.
MSpeed
2
Eine wichtige Überlegung, um störende Störungen beim Löschen zu vermeiden: Sie müssen diese Zeile nicht aufrufen. Recycler.removeViewAt (position);
Angelo Nodari
7
NotifyDataSetChanged ist übertrieben, insbesondere wenn Sie mit SEHR langen Listen arbeiten. Das Ganze für ein paar Gegenstände neu laden? Nein Danke. Auch recycler.removeViewAt (Position)? Nicht benötigt. Und Sie müssen nicht sowohl "mAdapter.notifyItemRemoved (position)" als auch "mAdapter.notifyItemRangeChanged (position, list.size ())" aufrufen. Entfernen Sie einige oder entfernen Sie eine. EINMAL benachrichtigen. Rufen Sie einen von ihnen an.
Vitor Hugo Schwaab
326

Dies ist eine allgemeine Antwort für zukünftige Besucher. Die verschiedenen Möglichkeiten zum Aktualisieren der Adapterdaten werden erläutert. Der Prozess umfasst jedes Mal zwei Hauptschritte:

  1. Aktualisieren Sie den Datensatz
  2. Benachrichtigen Sie den Adapter über die Änderung

Einzelteil einfügen

Fügen Sie "Schwein" am Index hinzu 2.

Einzelteil einfügen

String item = "Pig";
int insertIndex = 2;
data.add(insertIndex, item);
adapter.notifyItemInserted(insertIndex);

Fügen Sie mehrere Elemente ein

Fügen Sie drei weitere Tiere am Index ein 2.

Fügen Sie mehrere Elemente ein

ArrayList<String> items = new ArrayList<>();
items.add("Pig");
items.add("Chicken");
items.add("Dog");
int insertIndex = 2;
data.addAll(insertIndex, items);
adapter.notifyItemRangeInserted(insertIndex, items.size());

Einzelteil entfernen

Entfernen Sie "Schwein" aus der Liste.

Einzelteil entfernen

int removeIndex = 2;
data.remove(removeIndex);
adapter.notifyItemRemoved(removeIndex);

Entfernen Sie mehrere Elemente

Entfernen Sie "Kamel" und "Schaf" aus der Liste.

Entfernen Sie mehrere Elemente

int startIndex = 2; // inclusive
int endIndex = 4;   // exclusive
int count = endIndex - startIndex; // 2 items will be removed
data.subList(startIndex, endIndex).clear();
adapter.notifyItemRangeRemoved(startIndex, count);

Entfernen Sie alle Gegenstände

Löschen Sie die gesamte Liste.

Entfernen Sie alle Gegenstände

data.clear();
adapter.notifyDataSetChanged();

Ersetzen Sie die alte Liste durch eine neue Liste

Löschen Sie die alte Liste und fügen Sie eine neue hinzu.

Ersetzen Sie die alte Liste durch eine neue Liste

// clear old list
data.clear();

// add new list
ArrayList<String> newList = new ArrayList<>();
newList.add("Lion");
newList.add("Wolf");
newList.add("Bear");
data.addAll(newList);

// notify adapter
adapter.notifyDataSetChanged();

Das adapterhat einen Verweis auf data, daher ist es wichtig, dass ich kein dataneues Objekt festgelegt habe. Stattdessen habe ich die alten Elemente gelöscht dataund dann die neuen hinzugefügt.

Einzelteil aktualisieren

Ändern Sie das Element "Schafe" so, dass "Ich mag Schafe" angezeigt wird.

Einzelteil aktualisieren

String newValue = "I like sheep.";
int updateIndex = 3;
data.set(updateIndex, newValue);
adapter.notifyItemChanged(updateIndex);

Verschieben Sie einen einzelnen Gegenstand

Bewegen Sie "Schafe" von Position 3zu Position 1.

Verschieben Sie einen einzelnen Gegenstand

int fromPosition = 3;
int toPosition = 1;

// update data array
String item = data.get(fromPosition);
data.remove(fromPosition);
data.add(toPosition, item);

// notify adapter
adapter.notifyItemMoved(fromPosition, toPosition);

Code

Hier ist der Projektcode als Referenz. Den RecyclerView-Adaptercode finden Sie unter dieser Antwort .

MainActivity.java

public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {

    List<String> data;
    MyRecyclerViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // data to populate the RecyclerView with
        data = new ArrayList<>();
        data.add("Horse");
        data.add("Cow");
        data.add("Camel");
        data.add("Sheep");
        data.add("Goat");

        // set up the RecyclerView
        RecyclerView recyclerView = findViewById(R.id.rvAnimals);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
                layoutManager.getOrientation());
        recyclerView.addItemDecoration(dividerItemDecoration);
        adapter = new MyRecyclerViewAdapter(this, data);
        adapter.setClickListener(this);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
    }

    public void onButtonClick(View view) {
        insertSingleItem();
    }

    private void insertSingleItem() {
        String item = "Pig";
        int insertIndex = 2;
        data.add(insertIndex, item);
        adapter.notifyItemInserted(insertIndex);
    }

    private void insertMultipleItems() {
        ArrayList<String> items = new ArrayList<>();
        items.add("Pig");
        items.add("Chicken");
        items.add("Dog");
        int insertIndex = 2;
        data.addAll(insertIndex, items);
        adapter.notifyItemRangeInserted(insertIndex, items.size());
    }

    private void removeSingleItem() {
        int removeIndex = 2;
        data.remove(removeIndex);
        adapter.notifyItemRemoved(removeIndex);
    }

    private void removeMultipleItems() {
        int startIndex = 2; // inclusive
        int endIndex = 4;   // exclusive
        int count = endIndex - startIndex; // 2 items will be removed
        data.subList(startIndex, endIndex).clear();
        adapter.notifyItemRangeRemoved(startIndex, count);
    }

    private void removeAllItems() {
        data.clear();
        adapter.notifyDataSetChanged();
    }

    private void replaceOldListWithNewList() {
        // clear old list
        data.clear();

        // add new list
        ArrayList<String> newList = new ArrayList<>();
        newList.add("Lion");
        newList.add("Wolf");
        newList.add("Bear");
        data.addAll(newList);

        // notify adapter
        adapter.notifyDataSetChanged();
    }

    private void updateSingleItem() {
        String newValue = "I like sheep.";
        int updateIndex = 3;
        data.set(updateIndex, newValue);
        adapter.notifyItemChanged(updateIndex);
    }

    private void moveSingleItem() {
        int fromPosition = 3;
        int toPosition = 1;

        // update data array
        String item = data.get(fromPosition);
        data.remove(fromPosition);
        data.add(toPosition, item);

        // notify adapter
        adapter.notifyItemMoved(fromPosition, toPosition);
    }
}

Anmerkungen

  • Wenn Sie verwenden notifyDataSetChanged(), wird keine Animation ausgeführt. Dies kann auch ein teurer Vorgang sein. Daher wird die Verwendung nicht empfohlen, notifyDataSetChanged()wenn Sie nur einen einzelnen Artikel oder eine Reihe von Artikeln aktualisieren.
  • Schauen Sie sich DiffUtil , wenn Sie große oder komplexe Änderungen an einer Liste machen.

Weitere Studie

Suragch
quelle
5
Super Antwort! Was wären die Schritte beim Ersetzen eines In-Elements, die zu einem anderen Ansichtstyp führen würden? Ist es nur notifyItemChanged oder ein kombiniertes Entfernen, gefolgt von einer Einfügung?
Semaphor
Mit Ihrem minimalen Beispiel scheint notifyItemChanged ausreichend zu sein. Es werden onCreateViewHolder und onBindViewHolder für das geänderte Element aufgerufen und die unterschiedliche Ansicht wird angezeigt. Ich hatte ein Problem in einer Anwendung, die ein Element aktualisiert, was zu einer anderen Ansicht führen würde, aber es scheint ein anderes Problem zu geben.
Semaphor
@ Suragch jede Idee zu meiner Frage: stackoverflow.com/questions/57332222/… Ich habe alles versucht, was in diesem Thread aufgeführt ist, aber ohne Erfolg :(
Wie wäre es, wenn wir DiffUtils verwenden, um Änderungen vorzunehmen? Sie sind nicht so flüssig wie das manuelle Aufrufen von .notify <Action> ().
GuilhE
1
Wirklich den Ball fallen gelassen Update single item, hätte ich Schildkröten mögen sollen
und
46

Das hat bei mir funktioniert:

recyclerView.setAdapter(new RecyclerViewAdapter(newList));
recyclerView.invalidate();

Nachdem ich einen neuen Adapter erstellt hatte, der die aktualisierte Liste enthält (in meinem Fall war es eine in eine ArrayList konvertierte Datenbank) und diesen als Adapter festgelegt hatte, versuchte ich es recyclerView.invalidate()und es funktionierte.

martinpkmn
quelle
12
Würde dies nicht die gesamte Ansicht aktualisieren, anstatt nur die geänderten Elemente zu aktualisieren?
TWilly
13
Anstatt jedes Mal einen neuen Adapter zu erstellen, habe ich in meiner benutzerdefinierten Adapterklasse eine Setter-Methode erstellt, um die neue Liste festzulegen. Rufen Sie danach einfach " YourAdapter adapter = (YourAdapter) recyclerView.getAdapter(); adapter.yourSetterMethod(newList); adapter.notifyDataSetChanged();Das heißt" an, es klingt wie das, was das OP zuerst versucht hat (fügen Sie dies einfach als Kommentar hinzu, damit es jemand anderem helfen kann, wie es in meinem Fall funktioniert hat).
Kevin Lee
2
Leser, geben Sie sich nicht damit zufrieden. Diese Antwort funktioniert, aber es gibt einen effizienteren Weg. Anstatt alle Daten erneut zu laden, fügen Sie die neuen Daten am effizientesten zum Adapter hinzu.
Sebastialonso
Ja, ich bin mit @TWilly einverstanden, dass die vollständige Ansicht auf der Benutzeroberfläche neu gezeichnet wird.
Rahul
18

Sie haben 2 Möglichkeiten, dies zu tun: Aktualisieren Sie die Benutzeroberfläche vom Adapter:

mAdapter.notifyDataSetChanged();

oder aktualisieren Sie es von recyclerView selbst:

recyclerView.invalidate();
ediBersh
quelle
15

Eine andere Möglichkeit ist die Verwendung von Diffutil . Es wird die ursprüngliche Liste mit der neuen Liste verglichen und die neue Liste als Aktualisierung verwendet, wenn sich etwas ändert.

Grundsätzlich können wir DiffUtil verwenden, um die alten Daten mit neuen Daten zu vergleichen und notifyItemRangeRemoved sowie notifyItemRangeChanged und notifyItemRangeInserted in Ihrem Namen aufrufen zu lassen.

Ein kurzes Beispiel für die Verwendung von diffUtil anstelle von notifyDataSetChanged:

DiffResult diffResult = DiffUtil
                .calculateDiff(new MyDiffUtilCB(getItems(), items));

//any clear up on memory here and then
diffResult.dispatchUpdatesTo(this);

//and then, if necessary
items.clear()
items.addAll(newItems)

Ich mache die berechneDiff-Arbeit außerhalb des Hauptthreads, falls es sich um eine große Liste handelt.

j2emanue
quelle
1
Wie aktualisieren Sie die Daten in Ihrem Adapter, obwohl dies korrekt ist? Angenommen, ich zeige List <Object> im Adapter an und erhalte ein neues Update mit List <Object>. DiffUtil berechnet eine Differenz und versendet sie im Adapter, tut jedoch nichts mit der ursprünglichen oder neuen Liste (in Ihrem Fall getItems(). Woher wissen Sie, welche Daten aus der ursprünglichen Liste entfernt / hinzugefügt / aktualisiert werden müssen?
vanomart
1
Vielleicht kann dieser Artikel helfen. .. medium.com/@nullthemall/…
j2emanue
@vanomart Sie müssen nur Ihr lokales Listenfeld direkt durch den neuen Listenwert ersetzen, wie Sie es normalerweise tun würden. Der einzige Unterschied bei diesem Ansatz besteht darin, dass Sie anstelle von notifyDataSetChanged () DiffUtil verwenden, um die Ansicht zu aktualisieren.
Carrizo
Hast du eine Idee von mir? Ich habe alles versucht, was hier aufgelistet ist, aber kein Glück: stackoverflow.com/questions/57332222/…
Vielen Dank für Ihre Antwort! Können Sie bitte erklären, warum ich nach den dispatchUpdatesTo das "clear" & "addAll" setzen soll? Tnx!
Adi Azarya
10

Aktualisieren Sie die Daten von Listenansicht, Rasteransicht und Recyclingansicht

mAdapter.notifyDataSetChanged();

oder

mAdapter.notifyItemRangeChanged(0, itemList.size());
Pankaj Talaviya
quelle
Dies scheint meine Daten erst zu aktualisieren, wenn der Benutzer mit dem Scrollen beginnt. Ich habe überall
nachgesehen
@ SudoPlz Sie können benutzerdefinierten Bildlauf-Listener zum Erkennen von Bildlauf verwenden und Ihre Benachrichtigungsoperation wie stackoverflow.com/a/31174967/4401692
Pankaj Talaviya
Danke Pankaj, aber genau das versuche ich zu vermeiden. Ich möchte alles aktualisieren, ohne dass der Benutzer den Bildschirm berührt.
SudoPlz
5

Der beste und coolste Weg, neue Daten zu den aktuellen Daten hinzuzufügen, ist

 ArrayList<String> newItems = new ArrayList<String>();
 newItems = getList();
 int oldListItemscount = alcontainerDetails.size();
 alcontainerDetails.addAll(newItems);           
 recyclerview.getAdapter().notifyItemChanged(oldListItemscount+1, al_containerDetails);
Rushi Ayyappa
quelle
2
Ich sehe Leute, die "notifyDataSetChanged" für ALLES verwenden, ist das nicht übertrieben? Ich meine, laden Sie die gesamte Liste neu, weil einige geändert oder hinzugefügt wurden ... Ich mag diesen Ansatz, der gerade mit der Methode "notifyItemRangeInserted" implementiert wurde.
Vitor Hugo Schwaab
5

Ich habe das gleiche Problem auf andere Weise gelöst. Ich habe keine Daten aus dem Hintergrund-Thread, auf die ich warte. Beginnen Sie also mit einer leeren Liste.

        mAdapter = new ModelAdapter(getContext(),new ArrayList<Model>());
   // then when i get data

        mAdapter.update(response.getModelList());
  //  and update is in my adapter

        public void update(ArrayList<Model> modelList){
            adapterModelList.clear(); 
            for (Product model: modelList) {
                adapterModelList.add(model); 
            }
           mAdapter.notifyDataSetChanged();
        }

Das ist es.

Ahmed Ozmaan
quelle
2

Diese Methoden sind effizient und gut geeignet, um eine Basis zu verwenden RecyclerView.

private List<YourItem> items;

public void setItems(List<YourItem> newItems)
{
    clearItems();
    addItems(newItems);
}

public void addItem(YourItem item, int position)
{
    if (position > items.size()) return;

    items.add(item);
    notifyItemInserted(position);
}

public void addMoreItems(List<YourItem> newItems)
{
    int position = items.size() + 1;
    newItems.addAll(newItems);
    notifyItemChanged(position, newItems);
}

public void addItems(List<YourItem> newItems)
{
    items.addAll(newItems);
    notifyDataSetChanged();
}

public void clearItems()
{
    items.clear();
    notifyDataSetChanged();
}

public void addLoader()
{
    items.add(null);
    notifyItemInserted(items.size() - 1);
}

public void removeLoader()
{
    items.remove(items.size() - 1);
    notifyItemRemoved(items.size());
}

public void removeItem(int position)
{
    if (position >= items.size()) return;

    items.remove(position);
    notifyItemRemoved(position);
}

public void swapItems(int positionA, int positionB)
{
    if (positionA > items.size()) return;
    if (positionB > items.size()) return;

    YourItem firstItem = items.get(positionA);

    videoList.set(positionA, items.get(positionB));
    videoList.set(positionB, firstItem);

    notifyDataSetChanged();
}

Sie können sie in einer Adapterklasse oder in Ihrem Fragment oder Ihrer Aktivität implementieren. In diesem Fall müssen Sie den Adapter instanziieren, um die Benachrichtigungsmethoden aufzurufen. In meinem Fall implementiere ich es normalerweise im Adapter.

Teocci
quelle
2

Ich fand heraus, dass eine wirklich einfache Möglichkeit, RecyclerView neu zu laden, darin besteht, einfach aufzurufen

recyclerView.removeAllViews();

Dadurch wird zunächst der gesamte Inhalt von RecyclerView entfernt und anschließend mit den aktualisierten Werten erneut hinzugefügt.

Jonathan Persgarden
quelle
2
Bitte benutzen Sie dies nicht. Sie werden um Ärger bitten.
Dell116
1

Ich habe die Antwort nach langer Zeit bekommen

  SELECTEDROW.add(dt);
                notifyItemInserted(position);
                SELECTEDROW.remove(position);
                notifyItemRemoved(position);
Roufal
quelle
0

Wenn nichts in den obigen Kommentaren erwähnt wird, funktioniert es für Sie. Es könnte bedeuten, dass das Problem woanders liegt.

Ein Ort, an dem ich die Lösung gefunden habe, war die Art und Weise, wie ich die Liste auf den Adapter gesetzt habe. In meiner Aktivität war die Liste eine Instanzvariable und ich habe sie direkt geändert, wenn sich Daten geändert haben. Da es sich um eine Referenzvariable handelte, war etwas Seltsames los. Also habe ich die Referenzvariable in eine lokale Variable geändert und eine andere Variable verwendet, um Daten zu aktualisieren und dann an addAll()die in den obigen Antworten erwähnte Funktion zu übergeben.

BitSmith
quelle