Spinner erzeugt von arrays.xml dynamisch erweitern

  • Antworten:7
Wicki12
  • Forum-Beiträge: 38

02.05.2014, 19:18:36 via Website

Hallo,

ich habe einen Spinner aus einer Datei 'res/values/arrays.xml' erzeugt und möchte nun danach vom Programm her ein weiteres Item hinzufügen. Ich erhalte eine "UnsupportedOperationException" beim Hinzufügen, Anweisung 'adapter.add((CharSequence)"zusatz";);'. Das soll daran liegen, dass die Basis des Spinners ein read-only Objekt ist und daher so nicht erweitert werden kann.
Hat jemand eine Lösung dafür ?

LogCat
05-02 19:04:04.844: E/AndroidRuntime(17122): FATAL EXCEPTION: main
05-02 19:04:04.844: E/AndroidRuntime(17122): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.thomaskuenneth.examples/com.thomaskuenneth.examples.LayoutActivity}: java.lang.UnsupportedOperationException

Code-Ausschnitt

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_layout);
    CheckBox cb = (CheckBox)findViewById(R.id.showLocation);
    cb.setChecked(true);
    Spinner sp = (Spinner)findViewById(R.id.loctype);

// Create an ArrayAdapter using the string array and a default spinner layout
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.loctype, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    // Apply the adapter to the spinner
    sp.setAdapter(adapter);
    adapter.add((CharSequence)"zusatz");
    adapter.notifyDataSetChanged();

    sp.setSelection(0);
    sp.setOnItemSelectedListener(this);

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.05.2014, 20:44:31 via Website

Du kannst doch das Array aus der Xml in ein Array objekt laden.
Zu diesem fügst du dann die Einträge hinzu die du brauchst.
Dann kannst du mit dem modifiziertem Array den ArrayAdapter initialisieren

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Wicki12
  • Forum-Beiträge: 38

03.05.2014, 08:24:56 via Website

Danke, das habe ich inzwischen auch gemacht. Hier ein Codestück:

            List<CharSequence> temp = new ArrayList<CharSequence>();
    for (int i=0;i<adapter.getCount();i++) {
        temp.add(adapter.getItem(i)); //alte Werte sammeln in ArrayList
    }
    temp.add((CharSequence)"zusatz"); //zusätzlicher Wert
    //basiert auf echter ArrayList
    adapter = new ArrayAdapter<CharSequence>(this,
            android.R.layout.simple_spinner_item, temp);

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.05.2014, 11:43:57 via Website

Und funktioniert dies auch?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Wicki12
  • Forum-Beiträge: 38

04.05.2014, 16:06:17 via Website

Das funktioniert. Das ist doch auch das, was Du angedeutet hast. Der Adapter enthält alle Werte aus der xml-Datei. Diese entnehme ich aus dem Adapter und füge sie in eine neue ArrayList ein plus Zusatzwert. Dann erzeuge ich den Adapter neu aus dieser ArrayList.
Hast Du eine (kürzere) Lösung ?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.05.2014, 16:49:41 via Website

Erst eine Array list erteugen dann dort die Werte aus der XML hinzufügen.
Als nächstes kommen die zusatzwerte.
Als letztes wir der ArrayAdapter initialisiert

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Wicki12
  • Forum-Beiträge: 38

05.05.2014, 15:34:54 via Website

dann dort die Werte aus der XML hinzufügen

das wird aber relativ umständlich, die xml-Datei einzulesen und dann die Werte zu entnehmen oder ?
Deshalb habe ich ja auf den ArrayAdapter zurückgegriffen weil der das schon erledigt hatte.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.05.2014, 15:47:42 via Website

Warum sollte das schwieiger sein.
Das String Array bekommst du so:

String[] Arrays = getResources().getStringArray(R.array.lists_array);

Dann fügst du dort deine Werte an und fertig.
Viellwicht vorher noch in eine Array list umwandeln

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten