2010-03-24 6 views
14

Ich hatte einen EditText, eine Schaltfläche und einen Spinner. Wenn Sie auf die Schaltfläche klicken, fügt der Drehfeld einen neuen Eintrag mit dem Namen hinzu, den Sie in EditText eingegeben haben. Aber hier ist die Frage, meine adapter.add() Methode scheint nicht funktioniert ... hier ist mein Code:Wie fügt man Artikel zu Spinner's ArrayAdapter hinzu?

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

     }}); 
} 

}

Dank! ... immer noch

+0

Sie don auf jeden Fall‘ t müssen Sie spinner.setAdapter() erneut in Ihrem View.OnClickListener aufrufen. Ihr Code sieht aus wie es sollte funktionieren. – synic

+1

Sie müssen auch 'notifyDataSetChanged()' nicht aufrufen. Nur 'adapter.add()' sollte ausreichen. Wenn du sagst "geht nicht", was meinst du? – CommonsWare

+0

Ich suchte die Antwort, und jemand sagt mir, call notifyDataSetChanged() und setAdapter() wieder könnte help.so ich füge es hinzu, aber es funktioniert immer noch nicht ... wenn ich es ausführen, und klicken Sie auf die Schaltfläche .it wird einen Fehler ausgeben: Die Anwendung wurde unerwartet beendet. Bitte versuchen Sie es erneut ... (Ich denke, das Problem ist auf die Methode spinner.add().) Danke für Ihre Hilfe! – allen

Antwort

1

Ich glaube, das funktioniert wie geplant, aber nicht wie erwartet. ArrayAdapter verwendet nur ein Array, aber der Listenkonstruktor wurde später hinzugefügt. Ich vermute, es ist nur ein ToArray() auf Ihrer Liste. Deshalb müssen Sie entweder add auf dem Adapter aufrufen oder einen neuen Adapter erstellen, wenn sich Ihre Liste ändert.

14

Wenn Sie Ihren ArrayAdapter erstellt haben, haben Sie ihm keine skalierbare Liste zugewiesen. Wenn Sie also addieren(), kann er die Größe nicht erhöhen und löst eine UnsupportedOperationException aus.

versuchen, etwas wie folgt aus:

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

Sie sollten eine Liste verwenden. Mit einem Array wie CharSequence [] erhalten Sie die gleiche UnsupportedOperationException-Ausnahme.

3

Javi ist richtig, außer verweisen Sie nicht auf ein Array für den zweiten Parameter.

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

können Sie eine Arraylist erstellen und alle Rückgriff auf dieses Objekt kopieren dann arrayadaptor erstellen und diese Arraylist senden und in OnClickListener der Schaltfläche, fügen EditText Inhaltsobjekt zu Arraylist dann notifydatasetchanged von adator nennen