Autore Topic: Problema Spinner: onItemSelected richiamato in fase di inizializzazione?!  (Letto 510 volte)

Offline matttt

Non capisco perché onItemSelected viene invocato anche in fase di inizializzazione successivamente all' onCreate del componente che lo contiene...
Ho cercato in giro e vedo che tanti hanno lo stesso problema... che risolvono ignorando la prima chiamata ad onItemSelected (usando ad esempio una variabile booleana initSpinner)... molto poco elegante per i miei gusti (soprattutto considerando che nella funzione del cambio di stato effettuo operazioni su files che non voglio vengano invocate ripetutamente).

Qualcuno conosce sistemi migliori?
(per il momento sto optando per rinunciare allo Spinner e usare un bottone che apre un dialog di selezione valori, un surrogato di uno Spinner insomma)
Le mie apps su Google Play Store:

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema Spinner: onItemSelected richiamato in fase di inizializzazione?!
« Risposta #1 il: 14 Ottobre 2013, 19:09:10 CEST »
0
Prova a registrare il listener nella OnResume() dell'acitivity.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline matttt

Re:Problema Spinner: onItemSelected richiamato in fase di inizializzazione?!
« Risposta #2 il: 14 Ottobre 2013, 19:23:23 CEST »
0
Idea interessante... ho appena fatto una prova, ma il problema persiste anche dopo l'onResume della classe base.
Codice (Java): [Seleziona]
@Override
protected void onResume()
{
    super.onResume();
    mySpinner.setOnItemSelectedListener( ... );
}
« Ultima modifica: 14 Ottobre 2013, 19:26:16 CEST da matttt »
Le mie apps su Google Play Store:

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema Spinner: onItemSelected richiamato in fase di inizializzazione?!
« Risposta #3 il: 14 Ottobre 2013, 21:08:27 CEST »
+1
Il problema effettivamente esiste, perchè suppongo che l'evento parta anche quando cambi orientazione. E suppongo dipenda dal fatto che ogni volta che una posizione dello spinner viene selezionata, anche in fase di creazione, è comunque un evento di selezione.

Se non ti crea problemi la rotazione, potresti prevedere nell'adapter una prima locazione "vuota", per la quale l'esecuzione non prevede nessun effetto.

Se vuoi gestire anche la rotazione, un modo alternativo a quello di "scartare il primo" potrebbe essere questo: crei un listener di tocco (onTouchListener) per cui solo quando il listener viene toccato dall'utente, prendi in considerazione gli eventi di cambio selezione.

Però tutto sommato rivaluterei l'idea di scartare il primo... poco elegante, ma decisamente semplice.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline matttt

Re:Problema Spinner: onItemSelected richiamato in fase di inizializzazione?!
« Risposta #4 il: 15 Ottobre 2013, 08:41:19 CEST »
0
Effettivamente il tuo discorso è coerente :)
Ma limita un po' l'usabilità del controllo in determinate situazioni come la mia.

Penso sarebbe più idoneo avere un evento OnItemSelectedChange (un po' come in Javascript) che viene invocato soltanto quando c'è un effettivo cambiamento di stato.

Mmm... questo mi suggerisce una soluzione che potrebbe essere migliore nel mio caso... posso salvarmi l'ultimo stato impostato dallo spinner e in onItemSelected vado a controllare se il nuovo stato è diverso da quello vecchio e agisco di conseguenza...

Grazie comunque il Bradipo, girando attorno al problema ho trovato una strada valida.
Le mie apps su Google Play Store: