2010-03-24 19 views
14

tenía un EditText, un botón y un spinner. Al hacer clic en el botón, la ruleta agregará un nuevo elemento con el nombre que ingresó en EditText. Pero aquí está la pregunta, mi adapter.add() método parece que no funciona ... aquí está mi código:cómo agregar un elemento al ArrayAdapter de Spinner?

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) { 

     }}); 
} 

}

gracias! ... aún esperando

+0

Definitivamente don' Necesito volver a llamar a spinner.setAdapter() en su View.OnClickListener. Sin embargo, su código parece que debería funcionar. – synic

+1

Tampoco necesita llamar a 'notifyDataSetChanged()'. Solo 'adapter.add()' debería ser suficiente. Cuando dices "no funciona", ¿qué quieres decir? – CommonsWare

+0

busqué la respuesta, y alguien me dice, llame a notifyDataSetChanged() y setAdapter() otra vez podría ser help.so lo agrego, pero todavía no funciona ... cuando lo ejecuto, y haga clic en el botón. saltará un error: la aplicación se detuvo de forma inesperada. Por favor intente de nuevo ... (creo que el problema está en el método spinner.add()). ¡Gracias por su ayuda! – allen

Respuesta

1

Creo que esto está funcionando como se diseñó, pero no como se esperaba. ArrayAdapter solía tomar solo una matriz, pero el constructor de la lista se agregó más tarde. Supongo que solo está haciendo un toArray() en su lista. Esta es la razón por la cual debe llamar agregar el adaptador o crear un nuevo adaptador cuando su Lista cambie.

14

Cuando haya creado su ArrayAdapter, no le ha asignado una lista redimensionable, de modo que cuando lo agrega() no puede incrementar el tamaño y arroja una UnsupportedOperationException.

intentar algo como esto:

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

Se debe utilizar una lista. Con una matriz como CharSequence [] obtendría la misma excepción UnsupportedOperationException.

3

Javi tiene razón, excepto que no hace referencia a una matriz para el segundo parámetro.

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

puede crear un ArrayList y copiar todo recurso a este objeto a continuación, crear arrayadaptor y enviar este ArrayList y en OnClickListener de botón, agregar contenido EditarTexto a ArrayList de objetos a continuación, llamar notifydatasetchanged de adator

Cuestiones relacionadas