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:
Hinzu kommt eine Enumeration (CountryCode) die die Länder-Auswahl im ersten Spinner steuert:
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?
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;
}
}
}