2012-04-12 5 views
7

Ho creato uno spinner che viene aggiornato automaticamente con i nomi delle appliance quando una persona aggiunge un'appliance utilizzando un adattatore di array. Ho creato un metodo OnItemSelected con lo spinner, quindi quando uno dei nomi nella selezione è selezionato, viene visualizzata una nuova finestra. Tuttavia, OnItemSelected seleziona automaticamente il primo elemento dell'elenco all'avvio dell'attività e quindi l'utente non ha la possibilità di effettuare una selezione finché non viene visualizzata la nuova finestra.Come rendere On Item Selected non scegliere automaticamente la prima voce

Ecco il codice:

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, 
     long arg3) { 
    // TODO Auto-generated method stub 
    startActivity(new Intent("com.lukeorpin.theappliancekeeper.APPLIANCESELECTED")); 
    } 

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

Qualcuno sa un modo in cui il primo elemento della lista solito viene selezionata automaticamente?

Ecco il codice per il resto del filatore:

ArrayAdapter<String> appliancenameadapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, ApplianceNames); //Sets up an array adapter containing the values of the ApplianceNames string array 
    applianceName = (Spinner) findViewById(R.id.spinner_name); //Gives the spinner in the xml layout a variable name 
    applianceName.setAdapter(appliancenameadapter); //Adds the contents of the array adapter into the spinner 

    applianceName.setOnItemSelectedListener(this); 
+0

Stai chiamando setSelection sullo Spinner? Com'è il resto del tuo codice attività? – twaddington

+0

Ho aggiunto il codice alla domanda principale, grazie – Sketzii

+0

possibile duplicato di [Come mantenere suItemSelected l'attivazione su uno Spinner appena istanziato?] (Http://stackoverflow.com/questions/2562248/how-to-keep -onitemelected-from-firing-off-on-a-new-instantiated-spinner) –

risposta

6

Qualcuno sa un modo in cui il primo elemento della lista solito viene selezionata automaticamente?

C'è sempre una selezione su Spinner, e non si può cambiare la situazione.

IMHO, non si dovrebbe usare Spinner per avviare l'avvio di un'attività.

Detto questo, è possibile utilizzare un boolean per verificare se questo è il primo evento di selezione e ignorarlo se lo è.

+0

Come dovrei fare per creare un flag booleano per questo? Sono molto nuovo a java, grazie – Sketzii

+0

Aggiungi un 'booleano isFirstSelection = true;' membro dei dati alla tua attività. In 'onItemSelected()', se 'isFirstSelection == true', basta semplicemente girarlo su' false', altrimenti chiama 'startActivity()'. I neofiti di Java dovrebbero dedicare del tempo a imparare Java fuori da Android prima di eseguire qualsiasi sviluppo su Android. – CommonsWare

+0

Grazie per l'aiuto, sono riuscito a risolverlo usando una bandiera booleana – Sketzii

17

Se si sta tentando di evitare la chiamata iniziale al metodo onItemSelected() dell'ascoltatore, un'altra opzione è utilizzare post() per sfruttare la coda messaggi della vista. La prima volta che lo spinner controlla l'ascoltatore, non sarà ancora impostato.

// Set initial selection 
spinner.setSelection(position); 

// Post to avoid initial invocation 
spinner.post(new Runnable() { 
    @Override public void run() { 
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     // Only called when the user changes the selection 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
     } 
    }); 
    } 
}); 
+1

molto bello, come per magia. Funziona. –

+0

mi ha aiutato a trovare la mia strada, grazie –

+1

molto buona risposta –

5

Ha funzionato per me,

private boolean isSpinnerInitial = true;

@Override 
    public void onItemSelected(AdapterView<?> parent, View view, 
      int position, long id) { 

     if(isSpinnerInitial) 
     { 
      isSpinnerInitial = false; 
     } 
     else { 
      // do your work... 
     } 

    } 
+0

con questa prima posizione non è selezionata – Deepak

+0

Non sai leggere domanda ... Si dice semplicemente "Come fare On elemento selezionato non sceglie automaticamente la prima voce" Quindi è per tutti gli sviluppatori che non vogliono la 1a posizione selezionata. – karan

+0

Ya capisco la risposta. Ho lo stesso requisito ma onItemSelected, l'elemento sulla prima posizione non è selezionato, ho dovuto selezionare la seconda posizione e quindi la prima posizione viene selezionata. Spero tu ora capisca cosa sto dicendo – Deepak

0

Dichiarare variabile isSpinnerInitial poi fare fare una selezione come selezione predefinita

spinnertaggeview.setSelection (-1); non effettua la selezione come -1 o tutto non selezionato come facciamo in. Netto o altra lingua. Quindi puoi ignorare quella linea.

testStringArrayListinside.add("Make a Selection"); 
ADD this line so that this is selected by default and user never selects it 

testStringArrayList = (ArrayList<String>) ClinqLinX.get("Tag"); 
       boolean added = false; 
      testStringArrayListinside.add("Make a Selection"); 
       for (String s : testStringArrayList) { 
        if (s != null || s != "") { 
         String[] results = s.split(","); // split on commas 

         for (String string : results) { 

          testStringArrayListinside.add(string); 
          Toast.makeText(getContext(), string, Toast.LENGTH_SHORT).show(); 
          added = true; 
         } 
        } 

       } 
       if (added == false) { 
        testStringArrayListinside.add("Not tagged details found"); 
       } 

       spinnertaggeview.refreshDrawableState(); 

      } 

      // Adapter: You need three parameters 'the context, id of the layout (it will be where the data is shown), 
      // and the array that contains the data 
      if (testStringArrayListinside.size() > 0) { 
       adapter = new ArrayAdapter<String>(this.getContext(),android.R.layout.select_dialog_singlechoice, testStringArrayListinside); 
       adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       // Here, you set the data in your ListView 
       spinnertaggeview.setAdapter(adapter); 
       isSpinnerInitial = true; 

       spinnertaggeview.setSelection(-1); 
       spinnertaggeview.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

        @Override 
        public void onItemSelected(AdapterView<?> arg0, View arg1, 
               int arg2, long arg3) { 
         if (isSpinnerInitial){ 

          isSpinnerInitial = false; 

          return;} 
         else{ 
         TextView tv = (TextView) arg1; 
         String spinner_value = tv.getText().toString(); 
         if (spinner_value.length() == 0) { 
          spinner_value = "Nothing"; 
         } 
         String strusername = spinner_value;//As you are using Default String Adapter 
         Toast.makeText(getContext(), strusername, Toast.LENGTH_SHORT).show(); 
         Intent intent = new Intent(spinnertaggeview.getContext(), Userdetails.class); 
         intent.putExtra("Username", strusername); 
         spinnertaggeview.getContext().startActivity(intent);} 

        } 
Problemi correlati