Spinner wird nicht aktualisiert

jerevat

Mitglied
Hallo,

ich habe hier zwei Spinner, die Länder (countries) und deren Bundesländer (states) wiedergeben sollen.
Die Länder und Bundesländer sind als Ressourcen hinterlegt:

XML:
<resources>
<!-- Länder -->
    <string-array name="countries">
        <item>Österreich</item>
        <item>Schweiz</item>
        <item>Deutschland</item>
    </string-array>
<!-- Bundesländer in Österreich -->
    <string-array name="states_at">
        <item>ATDummy1</item>
        <item>ATDummy2</item>
    </string-array>
<!-- Bundesländer in Schweiz -->
    <string-array name="states_ch">
        <item>CHDummy1</item>
        <item>CHDummy2</item>
    </string-array>
<!-- Bundesländer in Deutschland -->
    <string-array name="states_de">
        <item>DEDummy1</item>
        <item>DEDummy2</item>
    </string-array>
</resources>

Hinzu kommt eine Enumeration (CountryCode) die die Länder-Auswahl im ersten Spinner steuert:

Java:
public enum CountryCode {    
    AT, CH, DE;
    public static CountryCode setInteger(int value) {
        switch (value) {
            case 0: return AT;
            case 1: return CH;
            case 2: return DE;
        }
        return null;
    }
}

Das Problem im nachfolgenden Code ist, dass der zweite Spinner mit den Bundesländern die voreingestellte Auswahl zwar lädt aber danach nicht mehr aktualisiert wird, sobald im ersten Spinner ein anderes Land ausgewählt wird.
Mittels Toast.makeText() stelle ich fest, dass das Bundesländer-Array (_states) sehr wohl aktualisiert wird, aber der zweite Spinner unverändert bleibt, auch nachdem sein Adapter mit _statesAdapter.notifyDataSetChanged() aktualisiert wird.
Woran scheitert es? Was meint ihr dazu?

Java:
public class MainActivity extends AppCompatActivity {
    Spinner _spCountries, _spStates;
    CountryCode _countryCode = CountryCode.AT;
    ArrayAdapter<String> _countriesAdapter, _statesAdapter;
    String[] _countries, _states;

    @Override    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        _spCountries = (Spinner) findViewById(R.id.spCountries);
        _spStates = (Spinner) findViewById(R.id.spStates);

        _countries = getResources().getStringArray(R.array.countries);
        updateStates(_countryCode);

        _countriesAdapter = new ArrayAdapter<>(this, androidx.constraintlayout.widget.R.layout.support_simple_spinner_dropdown_item, _countries);
        _spCountries.setAdapter(_countriesAdapter);
        _statesAdapter = new ArrayAdapter<>(this, androidx.constraintlayout.widget.R.layout.support_simple_spinner_dropdown_item, _states);
        _spStates.setAdapter(_statesAdapter);

        _spCountries.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                _countryCode = CountryCode.setInteger(i);
                updateStates(_countryCode);
                _statesAdapter.notifyDataSetChanged();

               String s;
               if (_states == null)
                   s = "null";
               else
                   s = _states[0];
               Toast.makeText(getApplicationContext(), s , Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) { }
        });
    }

    private void updateStates(CountryCode nations) {    
        _states = null;
        switch (nations) {
            case AT: _states = getResources().getStringArray(R.array.states_at);
                break;
            case CH: _states = getResources().getStringArray(R.array.states_ch);
                break;
            case DE: _states = getResources().getStringArray(R.array.states_de);
                break;
        }
    }
}
 

LimDul

Top Contributor
Das Problem dürfte sein, dass dein StatesAdapter nix von der Änderung mitbekommt. Den du änderst nicht den Inhalt des _states Array sondern weißt da einfach eine neue Variable zu. Das funktioniert so nicht, der Adapter hat immer noch eine Variable übergeben bekommen, die auf den alten Inhalt zeigt.

Du darfst nicht _states was neues zuweisen, sondern muss den Inhalt austauschen. Da eignet sich vermutlich eine Liste besser als ein Array - da kannst du einfach list.clear(); list.add(...); machen und das sollte gehen.
 

jerevat

Mitglied
Das Problem dürfte sein, dass dein StatesAdapter nix von der Änderung mitbekommt. Den du änderst nicht den Inhalt des _states Array sondern weißt da einfach eine neue Variable zu. Das funktioniert so nicht, der Adapter hat immer noch eine Variable übergeben bekommen, die auf den alten Inhalt zeigt.

Du darfst nicht _states was neues zuweisen, sondern muss den Inhalt austauschen. Da eignet sich vermutlich eine Liste besser als ein Array - da kannst du einfach list.clear(); list.add(...); machen und das sollte gehen.
Das habe ich nun angepasst:

Java:
List<String> _states;
// List<String> _states = new ArrayList<>();

private void updateStates(CountryCode nations) {
    switch (nations) {   
        // _states.clear();  // führt zum Absturz
        case AT: _states = Arrays.asList(getResources().getStringArray(R.array.states_at));
            break;
        case CH: _states = Arrays.asList(getResources().getStringArray(R.array.states_ch));
            break;
        case DE: _states = Arrays.asList(getResources().getStringArray(R.array.states_de));
            break;
    }
}

Das führt zum gleichen Ergebnis: Der zweite Spinner wird nicht aktualisiert.
Gibt es andere Methoden, eine String-Array-Ressource in eine List<> zu übergeben?
 

KonradN

Super-Moderator
Mitarbeiter
Du weist da doch schon wieder eine neue List zu und aktualisierst die vorhandene nicht.

Die .clear Methode wurde schon genannt. Statt dem add wirst Du vermutlich addAll nutzen wollen.

Also etwas wie:
Java:
private void updateStates(CountryCode nations) {
    _states.clear();
    switch (nations) {   
        // _states.clear();  // führt zum Absturz
        case AT:
            _states.addAll(Arrays.asList(getResources().getStringArray(R.array.states_at)));
            break;
        case CH:
            _states.addAll(Arrays.asList(getResources().getStringArray(R.array.states_ch)));
            break;
        case DE:
            _states.addAll(Arrays.asList(getResources().getStringArray(R.array.states_de)));
            break;
    }
}

Das ist jetzt im Forum entstanden, also Tippfehler sind möglich.
 

KonradN

Super-Moderator
Mitarbeiter
Und bezüglich der Bezeichner: public static CountryCode setInteger(int value) { ist etwas dubios. Du setzt doch keinen Integer. Das wäre also eher etwas wie ein getById oder so.

Und da kannst Du übrigens auch über values() gehen, also etwas wie:
Java:
    public enum CountryCode {
        AT, CH, DE;
        public static CountryCode getById(int index) {
            return values()[index];
        }
    }

Wobei ich da dann sowas lieber hart kodiere und nicht über die Reihenfolge gehe. Dann hat jedes Element ein Attribut Id. Das wäre dann etwas wie:
Java:
    public enum CountryCode {
        AT(0),
        CH(1),
        DE(2);

        private final int id;

        CountryCode(final int id) {
            this.id = id;
        }

        public static CountryCode getById(int index) {
            for (CountryCode countryCode: values()) {
                if (countryCode.id == index) return countryCode;
            }

            return null;
        }
    }

Das nur als kleiner Hinweis, weil es mir so direkt aufgefallen ist.
 

jerevat

Mitglied
Java:
private void updateStates(CountryCode nations) {
    _states.clear();
    switch (nations) {  
        // _states.clear();  // führt zum Absturz
        case AT:
            _states.addAll(Arrays.asList(getResources().getStringArray(R.array.states_at)));
            break;
        case CH:
            _states.addAll(Arrays.asList(getResources().getStringArray(R.array.states_ch)));
            break;
        case DE:
            _states.addAll(Arrays.asList(getResources().getStringArray(R.array.states_de)));
            break;
    }
}
So funktioniert das. Danke!

Und bezüglich der Bezeichner: public static CountryCode setInteger(int value) { ist etwas dubios. Du setzt doch keinen Integer. Das wäre also eher etwas wie ein getById oder so.

Und da kannst Du übrigens auch über values() gehen, also etwas wie:
Java:
    public enum CountryCode {
        AT, CH, DE;
        public static CountryCode getById(int index) {
            return values()[index];
        }
    }
Ich tue mir immer schwer mit Namen. =D
Die Schreibweise gefällt mir. An Java muss ich mich noch gewöhnen. Damit habe ich erst seit gut zwei Wochen zu tun.

LimDul und du wart eine große Hilfe!​

 

KonradN

Super-Moderator
Mitarbeiter
Ach ja - was ich ganz übersehen hatte:
// _states.clear(); // führt zum Absturz

Das Problem dürfte da gewesen sein, dass in der Java Syntax keine Statements innerhalb des switch Blocks sein dürfen. Da dürfen nur die case Elemente kommen. Das Statement hätte also in den Block nach dem case kommen müssen. Es wäre also auch gegangen:
Java:
private void updateStates(CountryCode nations) {
    switch (nations) { 
        case AT:
            _states.clear();
            _states.addAll(Arrays.asList(getResources().getStringArray(R.array.states_at)));
            break;

Da dies aber doch nach jedem case gekommen wäre, hat es Sinn gemacht, es vor das switch zu ziehen.

Ich tue mir immer schwer mit Namen. =D
Ja, das ist am Anfang normal. Das kommt aber von ganz alleine. Bei Code Reviews ist das am Anfang bei jedem oft so, dass da die Rename Funktionalität der IDE zum glühen gebracht wird. Zumindest ist das meine Erfahrung.

Damit habe ich erst seit gut zwei Wochen zu tun.
Dafür ist es doch schon ein recht ordentliches Ergebnis. Bleib einfach weiter dran und weiter viel Spaß beim Entwickeln!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Android Spinner-Array ändern Android & Cross-Platform Mobile Apps 6
T Firestore Daten in Spinner Android & Cross-Platform Mobile Apps 0
C Zugriff auf die Position eines String- bzw Spinner-Arrays Android & Cross-Platform Mobile Apps 1
S Android Style vom Spinner ändern (Dropdown sowie Fontfarbe) Android & Cross-Platform Mobile Apps 1
J android Spinner funktioniert nicht Android & Cross-Platform Mobile Apps 14
B Bitmap Array im Spinner übergeben? Android & Cross-Platform Mobile Apps 28
P Android Probleme mit Spinner Android & Cross-Platform Mobile Apps 3
G Android Spinner dynamisch aus DB SQL Select befüllen Android & Cross-Platform Mobile Apps 10
N Android spinner.item index als integer ? Android & Cross-Platform Mobile Apps 10
L Android Problem mit "spinner" Android & Cross-Platform Mobile Apps 10
F Android Spinner mit Ids Android & Cross-Platform Mobile Apps 4
F Android Fehler in Spinner Android & Cross-Platform Mobile Apps 3
F Android Spinner zur Laufzeit mit verschiedenem Inhalt füllen Android & Cross-Platform Mobile Apps 2
W Reward Ads AdMob wird nicht ausgeliefert. Android & Cross-Platform Mobile Apps 9
Naxon89 Duplicate class kotlin - und dies ohne das es angewendet wird Android & Cross-Platform Mobile Apps 1
ImageView wird nicht angezeigt Android & Cross-Platform Mobile Apps 4
W Bildschirm Nutzung Überwachen der App Nutzer ink. was angeklickt wird Android & Cross-Platform Mobile Apps 35
N XY-Plottet keine Daten obwohl Funktion ausgeführt wird Android & Cross-Platform Mobile Apps 4
K Null-Pointer-Exception in ListView - wird über Datenbank gefüllt Android & Cross-Platform Mobile Apps 1
R Android Do not disturb: Sound wird nicht abgespielt Android & Cross-Platform Mobile Apps 2
O Google Admob Ad wird nicht geladen und App stürzt ab Android & Cross-Platform Mobile Apps 1
M Paper DB wird in Android Studio nicht erkannt Android & Cross-Platform Mobile Apps 7
R Audio wird nur 1 Mal abgespielt Android & Cross-Platform Mobile Apps 2
A GraphView => X- und Y-Achse wird nicht angezeigt Android & Cross-Platform Mobile Apps 5
A jpg wird im Android Studio nicht akzeptiert Android & Cross-Platform Mobile Apps 3
Arif Android Radiobutton wird nicht deaktiviert Android & Cross-Platform Mobile Apps 1
Arif Android Canvas wird nicht gezeichnet? Android & Cross-Platform Mobile Apps 0
J Notification wird nicht angezeigt wenn App nicht offen ist. Android & Cross-Platform Mobile Apps 6
M TypedArray-Resource wird falsch geladen Android & Cross-Platform Mobile Apps 7
W Preview wird nicht korrekt angezeigt Android & Cross-Platform Mobile Apps 0
B Profilpic wird nach anmeldung nicht angezeigt. Android & Cross-Platform Mobile Apps 2
K Methode wird nicht gefunden Android & Cross-Platform Mobile Apps 1
J Kamera - Foto wird nicht gespeichert Android & Cross-Platform Mobile Apps 2
V Android Wird mein Vorhaben funktionieren? (Apk Datei decompilieren, bearbeiten, compilieren) Android & Cross-Platform Mobile Apps 2
G App wird nach Installation auf Smartphone beendet Android & Cross-Platform Mobile Apps 1
L Dialog anzeigen wenn auf Button gedrückt wird. Android & Cross-Platform Mobile Apps 4
S Android neue Version des Programms wird nicht in Emulator geladen Android & Cross-Platform Mobile Apps 1
O Android Switch Widget wird nicht angezeigt Android & Cross-Platform Mobile Apps 1
M Android ListView wird nicht dargestellt Android & Cross-Platform Mobile Apps 2
N PriceScannerApp: warum wird nach dem Scannen Display gleich schwarz? Android & Cross-Platform Mobile Apps 4
P Herausfinden, welches Fragment gerade angezeigt wird. Android & Cross-Platform Mobile Apps 1
M Android Nur erste Zeile wird vom Server empfangen Android & Cross-Platform Mobile Apps 0
A App wird bei start des Timers beendet Android & Cross-Platform Mobile Apps 1
A Wieso wird die App beendet ??? Android & Cross-Platform Mobile Apps 2
B Alle Daten gehen verloren, wenn die Displaysperre aktiviert wird? Android & Cross-Platform Mobile Apps 21
P trotz invalidate() wird onDraw() nicht aufgerufen Android & Cross-Platform Mobile Apps 15
W XML Layout: wann wird geladen? Android & Cross-Platform Mobile Apps 10
K Android Temperaturconverter, R.id.element wird nicht gefunden Android & Cross-Platform Mobile Apps 20
A onDraw wird nicht aufgerufen Android & Cross-Platform Mobile Apps 14
A Android Dialog wird nicht sofort angezeigt Android & Cross-Platform Mobile Apps 12
W ImageView wird nicht angezeigt Android & Cross-Platform Mobile Apps 19
T Android: ListView-Adapter: Adapter wird ständig aufgerufen Android & Cross-Platform Mobile Apps 2
F Android Datenbank upgrade wird nicht durchgeführt Android & Cross-Platform Mobile Apps 2
F Android R.raw wird nicht gefunden Android & Cross-Platform Mobile Apps 5
P ID wird nicht erzeugt Android & Cross-Platform Mobile Apps 2
C Problem Device/Emulator wird nicht erkannt Android & Cross-Platform Mobile Apps 3
R Zeichen-Codierung in (SMS) TextMessage, "_" wird § Android & Cross-Platform Mobile Apps 2
W MoveEvent reagiert nicht Game Android & Cross-Platform Mobile Apps 1
W Cookie Manger übermittelt nicht Android & Cross-Platform Mobile Apps 1
M PythonInterpreter funktioniert nicht richtig NoClassDefFoundError Android & Cross-Platform Mobile Apps 1
I Android SharedPreferences wenn App auf externem Speicher klappt nicht Android & Cross-Platform Mobile Apps 0
W Frisch generiertes Projekt Value nicht findbar NavController Drawer Android & Cross-Platform Mobile Apps 12
W WebView Linkvertise lädt nicht richtig oder bleibt grau Android & Cross-Platform Mobile Apps 10
W AlertDialog Eigenschaften existiert nicht mehr. Android & Cross-Platform Mobile Apps 14
W Wieso gehen Log nicht im Service? Android & Cross-Platform Mobile Apps 20
I Android ListView (Custom) soll auf Hardwaretasten nicht reagieren. Android & Cross-Platform Mobile Apps 10
CT9288 Zufällige Zahlengenerierung scheint nicht richtig zu funktionieren Android & Cross-Platform Mobile Apps 5
M App crasht und ich bekomme es nicht behoben.:( Android & Cross-Platform Mobile Apps 17
K Android Android In-App-Purchase lädt nicht Android & Cross-Platform Mobile Apps 0
Besset Android http request an interne ip adresse funktioniert nicht Android & Cross-Platform Mobile Apps 8
R Android Visualizer engine kann nicht initialisiert werden Android & Cross-Platform Mobile Apps 3
OSchriever Navigation drawer Strings ändern sich nicht Android & Cross-Platform Mobile Apps 0
W Code läuft unter SDK 27 aber nicht SDK 30 Android & Cross-Platform Mobile Apps 17
N Android Ich kann mit meiner App nicht auf die Datenbank zugreifen Android & Cross-Platform Mobile Apps 4
ruutaiokwu Android Selbst entwickelter SMTP-Client läuft auf PC, nicht aber auf Android Android & Cross-Platform Mobile Apps 9
W Android Wieso geht getApplicationContext() bei Toast, aber nicht bei AlertDialog.Builder? Android & Cross-Platform Mobile Apps 36
A Android Studio: while-Schleife beginnt nicht Android & Cross-Platform Mobile Apps 5
T Android SDK-Manager startet nicht in Eclipse Android & Cross-Platform Mobile Apps 5
J Download und speichern mit jsch klappt nicht Android & Cross-Platform Mobile Apps 5
J Service starte nicht mehr Android & Cross-Platform Mobile Apps 13
J Firebase und Emulator startet nicht Android & Cross-Platform Mobile Apps 2
L ListView aktuallisiert sich nicht Android & Cross-Platform Mobile Apps 15
J ArrayAdapter zeigt Liste nicht an Android & Cross-Platform Mobile Apps 0
L Android Animationen werden nicht angezeigt Android & Cross-Platform Mobile Apps 0
Excess Android Service läuft nicht in Sandby weiter Android & Cross-Platform Mobile Apps 2
J App funktioniert auf Android 5, auf 6 nicht Android & Cross-Platform Mobile Apps 2
K Log.v geht nicht Android & Cross-Platform Mobile Apps 4
L Android Android Studio - Exportierte APK funktioniert nicht Android & Cross-Platform Mobile Apps 6
L Android Methode funktioniert nicht unter Android Android & Cross-Platform Mobile Apps 3
L Android Java scheint XML nicht zu finden Android & Cross-Platform Mobile Apps 11
B Android osmdroid möchte nicht das es mapnik herunterlädt Android & Cross-Platform Mobile Apps 2
apple_pie1998 SharedPreferences funktionieren nicht... Android & Cross-Platform Mobile Apps 17
B Android Textdatei laden (klappt nicht) Android & Cross-Platform Mobile Apps 4
S Android null pointer (ich verstehs nicht) Android & Cross-Platform Mobile Apps 2
S Android Emulator startet nicht vollständig. Android & Cross-Platform Mobile Apps 0
S Neue Activity lässt sich nicht starten Android & Cross-Platform Mobile Apps 28
M Notification nicht mehr senden nachdem sie geklickt wurde Android & Cross-Platform Mobile Apps 0
D Android Tabs nutzen - PagerTitleStrip haut nicht hin Android & Cross-Platform Mobile Apps 4
K MediaPlayer Soundklasse Start und Stop (stop funktioniert nicht) Android & Cross-Platform Mobile Apps 1
O Android Anfänger: Quellcode nicht gefunden Android & Cross-Platform Mobile Apps 3

Ähnliche Java Themen

Neue Themen


Oben