Autore Topic: [Spinner] capire quando l'evento onItemSelected è generato da codice  (Letto 720 volte)

Offline HappyMan

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei IDEOS
  • Sistema operativo:
    Microsoft Windows XP
Ciao a tutti,
ho il seguente problema: la mia classe implementa l'interfaccia OnItemSelectedListener per gestire l'evento onItemSelected.

Ho la necessità di individuare quando l'evento scatta dopo aver cambiato l'item selezionato da codice piuttosto che da un click dell'utente.
C'è qualche proprietà dello spinner che mi permetta questa verifica quando sono nell'evento onItemSelected ?

Ciao

HappyMan

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:[Spinner] capire quando l'evento onItemSelected è generato da codice
« Risposta #1 il: 06 Agosto 2011, 16:36:46 CEST »
0
Se ho capito bene tu vuoi sapere quando l'item dello spinner è cambiato da codice (presumo per una funzionalità che vuoi mettere) o quando è cambiato perchè l'utente ha effettivamente cliccato su un ci sia una propietà per questo. Magari aspetta qualcuno un pò più sapiente di me :D

Per il momento io farei così:
Dichiaro una variabile boolean = false;
Nel codice che cambia l'item dello spinner (quindi lo cambia da codice) la setto a true.
Nel OnItemSelectedListener controllo la variabile: se è true l'item è cambiato da codice. Se no è stato l'utente.
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline HappyMan

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei IDEOS
  • Sistema operativo:
    Microsoft Windows XP
Re:[Spinner] capire quando l'evento onItemSelected è generato da codice
« Risposta #2 il: 06 Agosto 2011, 20:59:47 CEST »
0
Se ho capito bene tu vuoi sapere quando l'item dello spinner è cambiato da codice (presumo per una funzionalità che vuoi mettere) o quando è cambiato perchè l'utente ha effettivamente cliccato su un ci sia una propietà per questo. Magari aspetta qualcuno un pò più sapiente di me :D

Per il momento io farei così:
Dichiaro una variabile boolean = false;
Nel codice che cambia l'item dello spinner (quindi lo cambia da codice) la setto a true.
Nel OnItemSelectedListener controllo la variabile: se è true l'item è cambiato da codice. Se no è stato l'utente.

Ciao,
ti ringrazio della risposta: questo approccio è stato il primo che ho pensato, ma non funziona per questo motivo: l'esecuzione dell'istruzione setSelection non fa scattare subito l'evento onItemSelected, ma questo viene in qualche modo messo in coda.

Teoricamente dovrebbe succedere questo, immaginando due spinner da modificare via codice:

1. metto a true il mio flag
2. setSelection sul primo spinner
3. esecuzione dell'evento onItemSelected, riconoscimento che è fatto da codice,  infine messo a false il flag

4. metto a true il mio flag
5. setSelection sul secondo spinner
6. esecuzione dell'evento onItemSelected, riconoscimento che è fatto da codice,  infine messo a false il flag

In realtà succede questo
1. metto a true il mio flag
2. setSelection sul primo spinner
non scatta subito l'evento onItemSelected
3. metto a true il mio flag
5. setSelection sul secondo spinner
6. esecuzione dell'evento onItemSelected, riconoscimento che è fatto da codice,  infine messo a false il flag
7. esecuzione dell'evento onItemSelected, il flag è a false e non riconosco che è fatto da codice

per questo motivo pensavo a qualche proprietà relativa al singolo spinner

Ciao

HappyMan
« Ultima modifica: 06 Agosto 2011, 21:01:23 CEST da HappyMan »

Offline HappyMan

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei IDEOS
  • Sistema operativo:
    Microsoft Windows XP
Re:[Spinner] capire quando l'evento onItemSelected è generato da codice
« Risposta #3 il: 07 Agosto 2011, 09:33:50 CEST »
0
Ciao,
ti ringrazio della risposta: questo approccio è stato il primo che ho pensato, ma non funziona per questo motivo: l'esecuzione dell'istruzione setSelection non fa scattare subito l'evento onItemSelected, ma questo viene in qualche modo messo in coda.

Teoricamente dovrebbe succedere questo, immaginando due spinner da modificare via codice:

1. metto a true il mio flag
2. setSelection sul primo spinner
3. esecuzione dell'evento onItemSelected, riconoscimento che è fatto da codice,  infine messo a false il flag

4. metto a true il mio flag
5. setSelection sul secondo spinner
6. esecuzione dell'evento onItemSelected, riconoscimento che è fatto da codice,  infine messo a false il flag

In realtà succede questo
1. metto a true il mio flag
2. setSelection sul primo spinner
non scatta subito l'evento onItemSelected
3. metto a true il mio flag
5. setSelection sul secondo spinner
6. esecuzione dell'evento onItemSelected, riconoscimento che è fatto da codice,  infine messo a false il flag
7. esecuzione dell'evento onItemSelected, il flag è a false e non riconosco che è fatto da codice

per questo motivo pensavo a qualche proprietà relativa al singolo spinner

Ciao

HappyMan

Ho trovato una soluzione funzionante che mantengo, se non esiste un metodo più "pulito":
1. utilizzo una variabile globale String nella quale accodo il tag di ogni spinner per il quale eseguo una selezione da codice
2. nell'evento onItemSelected verifico se il tag del controllo corrente è presente nella stringa
3. in caso affermativo l'evento è causato da codice altrimento dall'utente
4. al termine eseguo un replace del tag corrente con stringa vuota

Ciao

HappyMan