2010-03-24 11 views
14

ho avuto un EditText, un pulsante e uno spinner. Quando fai clic sul pulsante, lo spinner aggiungerà un nuovo oggetto con il nome inserito in EditText. Ma ecco la domanda, il mio adapter.add() metodo sembra non funziona ... qui è il mio codice:come aggiungere elementi a Spinner's ArrayAdapter?

public class Spr extends Activity { 
Button bt1; 
EditText et; 
ArrayAdapter<CharSequence> adapter; 
Spinner spinner; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    bt1 = (Button)this.findViewById(R.id.bt1); 
    et = (EditText)this.findViewById(R.id.et); 
    spinner = (Spinner)this.findViewById(R.id.spr); 

    adapter = ArrayAdapter.createFromResource(
      this, R.array.planets_array, android.R.layout.simple_spinner_item); 

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    spinner.setAdapter(adapter); 

    bt1.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      String temp = et.getText().toString(); 

      adapter.add(temp); 
      adapter.notifyDataSetChanged(); 
      spinner.setAdapter(adapter); 

     } 
    }); 


    spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){ 

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

      Toast.makeText(parent.getContext(), "The planet is " + 
         parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show(); 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 

     }}); 
} 

}

grazie! ... ancora in attesa

+0

È sicuramente don' t necessario chiamare nuovamente spinner.setAdapter() in View.OnClickListener. Il tuo codice sembra che dovrebbe funzionare, però. – synic

+1

Inoltre non è necessario chiamare 'notifyDataSetChanged()'. Giusto 'adapter.add()' dovrebbe essere sufficiente. Quando dici "non funziona", cosa intendi? – CommonsWare

+0

ho risposto alla domanda, e qualcuno mi dice, chiama notifyDataSetChanged() e setAdapter() potrebbe essere di nuovo help.so lo aggiungo, ma non funziona ancora ... quando lo eseguo, e clicco sul pulsante .it salterà fuori un errore: l'applicazione si è fermata inaspettatamente. Si prega di riprovare ... (penso che il problema sia nel metodo spinner.add().) grazie per il vostro aiuto! – allen

risposta

1

Credo che funzioni come previsto, ma non come previsto. ArrayAdapter utilizzato solo per prendere un array, ma il costruttore elenco è stato aggiunto in seguito. Immagino che stia facendo un toArray() nella tua lista. Questo è il motivo per cui devi chiamare add sulla scheda o creare un nuovo adattatore quando l'Elenco cambia.

14

Dopo aver creato il tuo ArrayAdapter non ti è stato assegnato un elenco ridimensionabile, quindi quando aggiungi() non è possibile incrementarne la dimensione e lancia una UnsupportedOperationException.

provare qualcosa di simile:

List<CharSequence> planets = new ArrayList<CharSequence>(); 
adapter = new ArrayAdapter<CharSequence>(context, 
         R.array.planets_array, planets); 
//now you can call adapter.add() 

È necessario utilizzare un elenco. Con una matrice come CharSequence [] otterresti la stessa eccezione UnsupportedOperationException.

3

Javi ha ragione tranne che non fa riferimento a un array per il secondo parametro.

adapter = new ArrayAdapter<CharSequence>(this, 
    android.R.layout.simple_spinner_item, 
    someList); 
0

è possibile creare un arraylist e copiare tutto il ricorso a questo oggetto quindi creare arrayadaptor e inviare questo arraylist e in onclicklistener del pulsante, aggiungere il contenuto EditText al ArrayList oggetto quindi chiamare notifydatasetchanged di adator

Problemi correlati