notifyDataSetChanged Beispiel

Ich versuche, in meiner Android Application die Methode notifyDataSetChanged() für einen ArrayAdapter aber es funktioniert nicht für mich.

Ich fand als Antwort hier , dass notifyDataSetChanged() im Hauptthread laufen sollte, aber dafür gab es kein Beispiel.

Kann jemand ein Beispiel oder zumindest einen Link senden ?!

    Für ein ArrayAdapter notifyDataSetChanged nur, wenn Sie die add() , insert() , remove() und clear() auf dem Adapter verwenden.

    Wenn ein ArrayAdapter wird, enthält es den Verweis für die übergebene List . Wenn Sie eine List , die Mitglied einer Aktivität war, übergeben und dieses Aktivitätsmitglied später ändern, enthält der ArrayAdapter weiterhin einen Verweis auf die ursprüngliche List . Der Adapter weiß nicht, dass Sie die List in der Aktivität geändert haben.

    Ihre Auswahlmöglichkeiten sind:

    1. Verwenden Sie die functionen des ArrayAdapter , um die zugrunde liegende Liste zu ändern ( add() , insert() , remove() , clear() usw.)
    2. Erstellen Sie den ArrayAdapter mit den neuen ArrayAdapter neu. (Verwendet viele Ressourcen und Garbage Collection.)
    3. Erstellen Sie eine eigene, von BaseAdapter und ListAdapter abgeleitete class, die das Ändern der zugrunde liegenden List Datenstruktur ermöglicht.
    4. Verwenden Sie die notifyDataSetChanged() jedes Mal, wenn die Liste aktualisiert wird. Um es auf dem UI-Thread runOnUiThread() , verwenden Sie runOnUiThread() of Activity . Dann notifyDataSetChanged() .

    Sie können die runOnUiThread() -Methode wie folgt verwenden. Wenn Sie keine ListActivity , passen Sie den Code an, um einen Verweis auf Ihren ArrayAdapter .

     final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter()); runOnUiThread(new Runnable() { public void run() { adapter.notifyDataSetChanged(); } }); 

    Ich habe vor kurzem zu diesem Thema geschrieben, obwohl dieses Post It alt, ich dachte, es wird hilfreich für jemanden sein, der wissen möchte, wie BaseAdapter.notifyDataSetChanged() Schritt für Schritt und in einer korrekten Weise zu implementieren.

    Bitte folgen Sie Wie Sie BaseAdapter.notifyDataSetChanged () in Android oder dem neueren Blog BaseAdapter.notifyDataSetChanged () korrekt implementieren .

    Ich hatte das gleiche Problem und ich möchte nicht den gesamten ArrayAdapter durch eine neue Instanz kontinuierlich ersetzen. Somit habe ich den AdapterHelper wo anderswo schwer zu heben.

    Fügen Sie dies hinzu, wo Sie normalerweise versuchen würden (notify) anzurufen

     new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList(yourArrayList)); adapter.notifyDataSetChanged(); 

    AdapterHelper-class

     public class AdapterHelper { @SuppressWarnings({ "rawtypes", "unchecked" }) public void update(ArrayAdapter arrayAdapter, ArrayList listOfObject){ arrayAdapter.clear(); for (Object object : listOfObject){ arrayAdapter.add(object); } } } 

    Ich weiß, dass dies eine späte Antwort ist, aber ich hatte ein ähnliches Problem, und ich habe es getriggers, indem ich notifyDataSetChanged() an der richtigen Stelle verwendet habe.

    Also war meine Situation wie folgt.

    Ich musste eine Listenansicht in einer Aktionsleiste (Fragment) mit Inhalten aktualisieren, die von einer völlig anderen Aktivität zurückgegeben wurden. Zu Beginn würde die Listenansicht jedoch keine Änderungen enthalten. Wenn ich jedoch auf eine andere Registerkarte klickte und dann zur gewünschten Registerkarte zurückkehrte, wurde die Listenansicht mit dem korrekten Inhalt der anderen Aktivität aktualisiert. notifyDataSetChanged() dies zu lösen, habe ich notifyDataSetChanged() des notifyDataSetChanged() Adapters im Code der Aktivität verwendet, die die Daten zurückgeben musste.

    Dies ist das Code-Snippet, das ich in der Aktivität verwendet habe.

     @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_new_forward: FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab Intent ina = new Intent(getApplicationContext(), MainActivity.class); ina.putExtra("stra", values1); startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment). } } 

    Diese Aktivität würde einige Daten an FragmentTab2 und würde meine Listenansicht in FragmentTab2 direkt aktualisieren.

    Hoffe jemand findet das nützlich!