2010-07-10 4 views

Antwort

26

Es hängt von der Adapterimplementierung ... wenn Sie einen Blick des Quellcodes nehmen Sie das sehen:

  1. notifyDataSetInvalidated() ruft die notifyInvalidated() der DataSetObservable Klasse (see here)
  2. Dann notifyInvalidated() ruft die onInvalidated() Methode für jede DataSetObserver (see here) auf.
  3. Dann kommt der lustige Teil: onInvalidated()does not do anything ...

Dies ist seine Umsetzung:

public void onInvalidated() { 
    // Do nothing 
} 

DataSetObserver ist eine abstrakte Klasse, so dass er in die Unterklasse ist zu entscheiden, was auf tun onInvalidated().

+0

Beachten Sie, dass Sie fast immer wollen Der Aufruf von 'notifyDataSetChanged() 'anstelle von invalidated - changed führt dazu, dass sich der Adapter selbst neu zeichnet. – karl

28

Soweit ich weiß, stoppt die notifyDataSetInvalidated() Methode den Adapter den Zugriff auf die Daten (im Falle, dass es ungültig ist, nicht verfügbar, etc.). Die Methode notifyDataSetChanged() aktualisiert die ListView, damit Sie die neuen Daten sehen können, aber Sie müssen sie im UI-Thread aufrufen.

Es hat mir sehr geholfen zu sehen this video - es gibt zwei Abschnitte, wo sie diese Methoden erwähnen und erklären, wie man sie richtig verwendet. Vielleicht hilft es dir auch :)

+0

Tolles Video. Wenn man präziser nach 17:35 schaut - http://youtu.be/wDBM6wVEO70?t=17m35s, "sind die Daten weg, wir werden nicht mehr darauf zugreifen", zum Beispiel wurde die Datei gelöscht. Das hat es für mich getroffen. – gor

18

Ich bin vor kurzem in diese Frage gelaufen und wollte für diejenigen, die sich programmatisch fragen, was passiert, wenn Sie notifyDataSetChanged() und notifyDataSetInvalidated() anrufen. es ist im Grunde ruft durch ein paar Klassen * Kurze Antwort, gehen here

Wie @Cristian in seiner Antwort erklärt, wenn Sie diese benachrichtigen Methoden auf Ihrem Adapter anrufen und onChanged()/onInvalidated() auf den registrierten DataSetObserver s für Ihren Adapter Aufruf endet.

Wenn Sie den Code folgen wird in der Tat Sie sehen, dass DataSetObserver abstrakt ist wie bereits erwähnt, und dass die onChanged()/onInvalidated() Methoden sind für die Umsetzung leere Warte durch eine Unterklasse.

Wenn dies das Ende der Geschichte wäre, warum sagen uns die Android Framework Engineers dann immer noch, dass wir diese Methoden aufrufen sollen, wenn sie nichts tun? Es dauerte etwas graben, aber es stellt sich heraus, dass es bereits eine Unterklasse dieser DataSetObserver namens AdapterDataSetObserver und es lebt in der abstrakten Klasse AdapterView (die durch Klassen wie GridView und ListView erweitert wird) lebt. Dieser Beobachter wird automatisch von Android erstellt, wenn Sie setAdapter() auf Ihrem AdapterView und erhält registered zu Ihrem Adapter.

Hier können Sie all die verrückten Dinge sehen, die diese Methoden tatsächlich tun.Die Dokumentation ist schlecht und zuerst dachte ich, ich müsste meine eigene Unterklasse DataSetObserver registrieren, um diese Funktion zu erhalten, aber es stellt sich heraus, dass eine bereits für Sie erstellt wurde.

* Etwas, das ich dachte, könnte nützlich sein: Ich glaube, dass Sie mehr als eine DataSetObserver zu Ihrem Adapter (zusätzlich zu den Standard) registrieren können. Dies würde Ihnen erlauben, bei Bedarf zusätzliche Arbeit zu leisten (wie zum Beispiel eine Fortschrittsbalkenansicht mit einer Bildansicht auszutauschen, wenn Bitmaps heruntergeladen werden).

3

Entsprechend der "the world of listView" Vorlesung sollten Sie es jedes Mal verwenden, wenn das listView nichts zu zeigen hat (was leere Daten bedeutet).

Ein Beispiel, über das sie sprechen, ist, wann die Filterung durchgeführt wird (auf der "publishResults" -Methode). auf dem Vortragsvideo ist es um 36:00 Uhr.

Das Seltsame ist, warum haben sie nicht fusionieren es nur mit notifyDataSetChanged, die für die Anzahl der Elemente überprüfen könnten, und entscheiden, es zu nennen selbst ...

Nach dem, was ich gesehen habe Was in der Vorlesung besprochen wurde, ist nicht ganz richtig. Wenn der Adapter zuvor einen Inhalt angezeigt hat und jetzt nichts mehr enthält und Sie jetzt notifyDataSetInvalidated aufrufen, wird nichts passieren. Der Inhalt bleibt also erhalten. Daher ist es sicher, notifyDataSetInvalidated nur zu verwenden, wenn sich die Daten nicht ändern .

Zum Beispiel, wenn Sie die Filter behandeln, und Sie erhalten die gleichen Ergebnisse (und vielleicht ist es genug, um die Anzahl der Ergebnisse zu überprüfen) wie zuvor, können Sie notifyDataSetInvalidated rufen statt notifyDataSetChanged

+0

Als Ihr letzter Absatz, wenn Sie die gleichen Ergebnisse erhalten, müssen Sie nichts tun, da die Daten die gleichen wie zuvor sind: p – HendraWD

+0

@HendraWijayaDjiono Das ist, was ich geschrieben habe. Es ist komisch, weil ich nicht den Sinn sehe, es jemals zu benutzen. Ich kann kein gutes Szenario finden, dass es nützlich ist. –