2012-03-20 10 views
9

Sto tentando di aggiornare una selezione da una voce selezionata da un'altra selezione. Il seguente blocco di codice descrive come l'ho fatto.Aggiornare le voci di selezione in base all'elemento selezionato di un'altra selezione

È possibile aggiornare correttamente lo spinner utilizzando l'istruzione if all'interno del metodo onItemSelected(). Ma il mio problema è che sembra che un ciclo continui a funzionare che seleziona automaticamente il valore "5" da spinner2 (così il Toast continua a sputare "Hai scelto 5").

Quando l'attività viene caricata, il Toast mostrerà ciascuna selezione tra tutte e tre le filature. Significa che la prima selezione per ogni trottola viene eseguita quando un adattatore è impostato su uno spinner?

E il binding adapter3 allo spinner3 (nell'istruzione if) attiva una nuova selezione di spinner2?

Grazie in anticipo!

public class WheelchairHelperMain extends Activity{ 

Spinner spinner2; 
Spinner spinner3; 
ArrayAdapter<CharSequence> adapter3 ; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.wheelchair_helper_main); 

    Spinner spinner1 = (Spinner)findViewById(R.id.spinner1); 
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(this, R.array.destinations_list, android.R.layout.simple_spinner_item); 
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner1.setAdapter(adapter1); 
    spinner1.setOnItemSelectedListener(new MyOnItemSelectedListener()); 

    spinner2 = (Spinner)findViewById(R.id.spinner2); 
    ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(this,R.array.departure_timeH_list,android.R.layout.simple_spinner_item); 
    adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner2.setAdapter(adapter2); 
    spinner2.setOnItemSelectedListener(new MyOnItemSelectedListener()); 

    spinner3 = (Spinner)findViewById(R.id.spinner3); 
    spinner3.setOnItemSelectedListener(new MyOnItemSelectedListener()); 



} 

public class MyOnItemSelectedListener implements OnItemSelectedListener{ 


    public void onItemSelected(AdapterView<?> parent, View v, int pos,long id) { 
     // TODO Auto-generated method stub 
     //use the selected station and departure time to calculate the required time 
      Toast toast = Toast.makeText(parent.getContext(),"You've chosen: " + parent.getItemAtPosition(pos), 2); 
      toast.show(); 

      if (spinner2.getSelectedItem().equals("5")){ 
       adapter3 = ArrayAdapter.createFromResource(WheelchairHelperMain.this,R.array.departure_timeH5M_list, android.R.layout.simple_spinner_item); 
       adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       spinner3.setAdapter(adapter3); 

      Log.v("spinner2","5"); 
      }else if(spinner2.getSelectedItem().equals("6")){ 

       adapter3 = ArrayAdapter.createFromResource(WheelchairHelperMain.this,R.array.departure_timeH6M_list, android.R.layout.simple_spinner_item); 
       adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       spinner3.setAdapter(adapter3); 

       Log.v("spinner2","6"); 
      } 

    } 



    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 

    } 

} 
} 

I seguenti sono i file xml. Questa è la stringa-array per spinner2:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="departure_timeH_prompt">何時?</string> 
<string-array name="departure_timeH_list"> 
    <item>5</item> 
    <item>6</item> 
    <item> 7 </item> 
    <item> 8 </item> 
    <item> 9 </item> 
    <item> 10 </item> 
    <item> 11 </item> 
    <item> 12 </item> 
    <item> 13 </item> 
    <item> 14 </item> 
    <item> 15 </item> 
    <item> 16 </item> 
    <item> 17 </item> 
    <item> 18 </item> 
    <item> 19 </item> 
    <item> 20 </item> 
    <item> 21 </item> 
    <item> 22 </item> 
    <item> 23 </item> 
    <item> 24 </item> 
    <item> 0 </item>  
    </string-array> 
</resources> 

La stringa-array per spinner3:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="departure_timeM_prompt">何分?</string> 
<string-array name="departure_timeH5M_list"> 
    <item> 5 </item> 
    <item> 24 </item> 
    <item> 38 </item> 
    <item> 52 </item> 
</string-array> 
<string-array name="departure_timeH6M_list"> 
    <item> 01 </item> 
    <item> 08 </item> 
    <item> 17 </item> 
    <item> 25 </item> 
    <item> 34 </item> 
    <item> 41 </item> 
    <item> 47 </item> 
    <item> 57 </item> 
</string-array> 
</resources> 

Ho appena trovato i miei problemi.

Nel codice originale:

spinner3.setAdapter(adapter3); 

è chiamato all'interno del onItemSelectedListener. Quando un adattatore è impostato su AdapterView, il primo elemento sull'adattatore verrà scelto automaticamente una volta. Quindi, attiverà di nuovo l'ascoltatore.

E poiché non ho impostato un flag per distinguere se la selezione proviene da spinner2 e mettere il spinner3.setAdapter(adapter3), continuerà semplicemente a eseguire "scegliendo il primo elemento su adapter3 -> controlla se l'elemento selezionato è 5" loop.

Quindi, inserire il seguente flag nel codice originale funziona per me:

if (parent.getId()==2131165201){ 
    //code to check selected item and define new adapter3 for spinner3 

risposta

0

Quando il cambiamento Spinner inserire i dati all'interno dell'adattatore del prossimo filatore. E basta scrivere adapter.notifyDataSetChanged(); Il contenuto all'interno del prossimo spinner cambierà.

+0

La prego quindi di elaborare più a come ottenere questo? Ho provato questo prima associazione del nuovo array di stringhe (file xml) all'adattatore, e quindi chiamare notifyDataSetChanged(). Ma non è successo niente. La modifica dei dati deve essere eseguita a livello di codice? – Bao

2

vorrei suggerire u utilizzare la posizione restituita dalla onItemclickListener e utilizzarlo in un array di inizializzazione adattatore di array per quel filatore: come ---

`

String hrs[]=getStringArray(R.array.departure_timeH6M_list); 
    if(hrs[pos].equals("5")) 
    { 

    } 

`

e così via ...

+0

grazie per il vostro aiuto, ho trovato dove è il mio problema! – Bao

0

Se ho capito bene la tua domanda, lo spinner sta selezionando un valore per impostazione predefinita. Sì, è corretto se lo spinner imposta su un adattatore seleziona il primo valore. devi scrivere un semplice trucco su onItemselectedListener per cancellare quella selezione predefinita. prende una variabile int = -1 nel mio codice è ageposition im prendendo un valore booleano selezionato per trovare la selezione predefinita. if (ageelected) significa spinner selezionato dall'utente.

infine use ageSpinner.setOnItemSelectedListener (new MyOnItemSelectedListener());

class MyOnItemSelectedListener implements OnItemSelectedListener { 

     public void onItemSelected(AdapterView<?> parent, 
      View view, int pos, long id) { 
      if(ageposition==-1) 
      { 
       ageselected=false; 
       ageposition=pos; 
      } 
      else 
      { 
       ageposition=pos; 
       ageselected=true; 
       childage=age[pos]; 
      } 


     } 
     public void onNothingSelected(AdapterView<?> parent) { 
      // Dummy 
     } 
    } 

auguriamo che il codice di cui sopra aiuta a

+0

Non capisco da dove viene il valore di 'ageposition'. Potresti per favore elaborare di più? Penso che potrebbe essere utile deselezionare la selezione predefinita se esiste un modo per farlo. – Bao

+0

vedi per spinner senza selezionare alcun valore anche il valore predefinito sarà selezionato questo valore sarà il primo elemento dell'array che verrà utilizzato in arrayadapter.Se usiamo setAdapter verrà richiamato onitemselected che imposterà il valore di posizione è "0". quindi per questa piccola hack che sta prendendo una posizione iniziale di variabile int in modo iniziale sarà '-1'. Se questa variabile è '-1', per impostazione predefinita sta chiamando Onitemselected usando setAdapter.Usando questa condizione stiamo trovando se l'utente seleziona esplicitamente spinner o che è dovuto a setAdapter.If che non è -1 utente sta selezionando spinner. – Manju

Problemi correlati