Warum zeigt das Spinner-Steuerelement weiterhin Prompt-Informationen an, auch wenn das Ereignis setOnItemSelectedListener nach setSelection ist?

9

Ich schreibe das Ereignis setOnItemSelectedListener von Spinner nach spinnerRanger.setSelection.

Ich denke, Toast.makeText(...) wird nicht gestartet, wenn ich die APP zum ersten Mal starte, aber prompte Informationen werden immer noch angezeigt, warum?

%Vor%

Trevor Carothers:

Wenn ich ein Listenereignis DoLongTimeOperation() vor Auswahl einfüge, wird es trotzdem den Toast anzeigen?

%Vor%

Code A:

%Vor%

Code B

%Vor%

Code C

%Vor%     
HelloCW 17.07.2015, 08:48
quelle

1 Antwort

4

Ich habe diesen Code einfach mit meinem eigenen ArrayAdapter ausgeführt und er hat den Toast sofort angezeigt, als die View erstellt wurde und setSelection () aufgerufen wurde, bevor der Listener gesetzt wurde (wie Sie es oben haben).

Dies ist definitiv nicht intuitiv, da Sie den Listener einstellen, NACHDEM die Auswahl getroffen wurde. Der einzige Weg, dem auf den Grund zu gehen, ist einen tiefen Tauchgang in den Quellcode. Nach dem Durchstöbern fand ich heraus, dass sie dieser runnable für den Haupt-Thread, um den Listener über Änderungen der Auswahl zu informieren. Dies ist die Reihenfolge der Ereignisse:

  1. Spinner Ansicht aufgeblasen
  2. Adapter (Datenquellen) festgelegt
  3. Auswahlsatz und SelectionNotifier Runnable gepostet
  4. Der Auswahllistener ist auf Spinner
  5. eingestellt
  6. SelectionNotifier wurde auf mainthread verarbeitet
  7. SelectionNotifier ruft onItemSelected () auf und Toast wird angezeigt

Geben Sie ein Runnable ein, um den Auswahllistener so festzulegen, dass er nach SelectionNotifier für das erste Pass-Through verarbeitet wird:

%Vor%

Die neue Reihenfolge der Ereignisse lautet:

  1. Spinner Ansicht aufgeblasen
  2. Adapter (Datenquellen) festgelegt
  3. Auswahlsatz und SelectionNotifier Runnable gepostet
  4. Runnable, um Selection Listener auf Spinner zu setzen, wird gepostet
  5. SelectionNotifier wurde auf mainthread verarbeitet
  6. SelectionNotifier hat keine zu benachrichtigenden Listener, sodass nichts unternommen wird. NO TOAST angezeigt!
  7. Unser Runnable, um den Selection-Listener auf Spinner zu setzen, wird auf dem Haupt-Thread verarbeitet und der Listener-Listener wird auf
  8. gesetzt
Trevor Carothers 24.07.2015, 05:10
quelle

Tags und Links