2010-03-03 5 views
14

Sto creando un spinner e ho aggiunto un OnItemSelectedListener ad esso. Tuttavia ho notato che si accende su creare. Ora mi chiedevo se c'era un modo per ignorarlo/scartarlo.ignora accensione OnItemSelectedListener su crea

So che potrei usare un valore boolean, ma questo è un po '"sporco".

risposta

0

Se qualcun altro incontra questa domanda, può valere la pena dare un'occhiata a a related question I asked a while ago, che ha diverse risposte con buone idee su come risolvere questo problema.

+0

Ho un altro problema con l'ascoltatore. se sparo un'attività asincrona dal metodo OnItemSelected, quindi ruoto il retun getLastNonConfigurationInstance null per l'attività che ho salvato su onRetainNonConfigurationInstance. Ma se metto il codice all'esterno nel file oncreate funzionerà bene ... – Maxrunner

+0

non hai detto che ci stai indicando 2 anche la tua risposta. – cosmincalistru

+3

@cosmincalistru: risolto il collegamento - Ho appena copiato quello che era nel mio URL del browser in quel momento, non ho capito che era una risposta al posto della domanda. Forse, col tempo, verrò a perdonare me stesso. –

1

Non tentare di impedire la chiamata allo OnItemSelectedListener.

Per impostazione predefinita, Android Spinners seleziona il primo elemento restituito dall'adapter e pertanto lo OnItemSelectedListener viene chiamato per attivare un'azione su quell'elemento.

Vorrei consigliare che il primo elemento nell'adattatore Spinner sia un elemento vuoto e che il tuo OnItemSelectedListener possa ignorare quell'elemento vuoto in base all'ID.

2

Ecco la mia soluzione.

Devo ignorare il primo evento di selezione degli articoli perché esiste una dipendenza tra lo Spinner del percorso e la casella di controllo del percorso.

E tutti i miei controlli sono impostati in base a una precedente visita dell'attività.

// Used to count the number of times the onItemSelected gets fired 
private int mGradeSelectionCount = 0; 

private void attachHandlers() { 
    OnItemSelectedListener gradeRangeSelectionMadeListener; 
    gradeRangeSelectionMadeListener = new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) { 
      // If the counter is 0 then we can assume that it is android firing the event 
      if (mGradeSelectionCount++ < 1) { 
       return; 
      } 
      if (mCmbGradeFrom.getSelectedItemPosition() == 0) { 
       // Uncheck the Route checkbox 
       mChkTypeRoute.setChecked(false); 
      } else { 
       // Check the Route checkbox 
       mChkTypeRoute.setChecked(true); 
      } 
     } 
     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // Dont care, keep the same values as before 

     } 
    }; 
    mCmbGradeFrom.setOnItemSelectedListener(gradeRangeSelectionMadeListener); 
    mChkTypeRoute.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (!isChecked) { 
       mCmbGradeFrom.setSelection(0); 
       mCmbGradeTo.setSelection(0); 
      } 
     } 
    }); 
} 
1

Questo può aiutare.

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{ 
    if(view!=null && view.getId()!=0){ 
     //do your code here to avoid callback twice 
    } 
} 
+0

Non ha funzionato :-( – sourcerebels

0

Beh penso che ho trovato bella soluzione per me, ho avuto in mente fin dall'inizio, ma ... ho classe wrapper personalizzato basato su Android Handler, che si chiama doLater, e c'è anche adattatore personalizzato basato su Listener, quindi non puoi copiare la pasta ma avrai un'idea. La cosa pericolosa è che in qualche modo il ritardo di 500 può essere troppo lungo e la vista può essere già distrutta (quando l'utente esegue velocemente alcune cose cablate o il telefono rallenta ...) quindi DoLater si preoccupa di ciò in modo che non venga richiamato quando l'attività non viene ripresa. Ma in questo modo OnItemSelectedListener non viene attivato su create.

public void onResume() { 
    super.onResume(); 
    new DoLater(this, 500) { 
       public void run() { 
        new OnSpinnerSelectedAdapter(getBowSpinner()) { 
         protected void onItemSelected(int position) { 
          onBowSelected(position); 
         } 
        }; 
       } 
      }; 
}