Actualizar City Spinner con notifyDataSetChanged después de seleccionar estado

¿Cómo actualizo mi spinner de la ciudad una vez que el usuario selecciona un estado?

Ambos campos se rellenan utilizando una DataCall.class que devuelve datos JSON y analiza la información en una matriz para la hiladora.

Mi código a continuación establece el adapter ciudad a un defualt "Select State" valor y una vez que el usuario obtiene selecciona el estado que debe utilizar notifyDataSetChanged ya que la matriz predeterminada para la ciudad spinner se actualiza con los nuevos nombres de la ciudad. Los errores que estoy recibiendo se comentan en mi código de abajo.

 public class SearchActivity extends Activity{ private static final String TAG = "MyApp"; ArrayAdapter<String> adapter2; String city_values[] = new String[]{"Please select a state."}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search_layout); final Spinner zipspinner = (Spinner) findViewById(R.id.zipspinner); final Spinner cityspinner = (Spinner) findViewById(R.id.cityspinner); adapter2 = new ArrayAdapter<String> (this,android.R.layout.simple_spinner_item, city_values); adapter2.setDropDownViewResource(R.layout.city_spinner_layout); cityspinner.setAdapter(adapter2); JSONArray jsonArray; try { String spinnerContentType = "state"; String spinnerURL = "getStoreState.php"; String spinner_data = DataCall.getJSON(spinnerURL,spinnerContentType); Log.d(TAG, spinner_data); jsonArray = new JSONArray(spinner_data); final String[] array_spinner = new String[jsonArray.length()]; for (int i=0; i<jsonArray.length(); i++) { String styleValue = jsonArray.getJSONArray(i).getString(0); Log.d(TAG, styleValue); array_spinner[i] = styleValue; } ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item,array_spinner); adapter.setDropDownViewResource(R.layout.state_spinner_layout); zipspinner.setAdapter(adapter); zipspinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent,View view, int pos, long id) { int item = zipspinner.getSelectedItemPosition(); if(item != 0){ String item_value = array_spinner[item]; String spinnerContentType = "city"; String spinnerURL = "getStoreCity.php?state=" + item_value; Log.d(TAG, spinnerURL); String city_data = DataCall.getJSON(spinnerURL,spinnerContentType); Log.d(TAG, city_data); JSONArray cityArray = null; try { cityArray = new JSONArray(city_data); } catch (JSONException e) { e.printStackTrace(); } final String[] city_spinner = new String[cityArray.length()]; for (int i=0; i<cityArray.length(); i++){ String styleValue = null; try { styleValue = cityArray.getJSONArray(i).getString(0); Log.d(TAG, styleValue); } catch (JSONException e) { e.printStackTrace(); } city_spinner[i] = styleValue; } city_values = city_spinner; adapter2.notifyDataSetChanged(); String test_string = "NOTIFY UPDATE"; Log.d(TAG, test_string); } else { // finish(); } } public void onNothingSelected(AdapterView parent) { // Do nothing. } }); cityspinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent,View view, int pos, long id) { int item = zipspinner.getSelectedItemPosition(); if(item != 0){ }else{ } } public void onNothingSelected(AdapterView parent) { // Do nothing. } }); }catch (JSONException e) { e.printStackTrace(); } } } 

 public class SearchActivity extends Activity { ArrayAdapter<String> adapter2; String city_values[]; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search_layout); final Spinner zipspinner = (Spinner) findViewById(R.id.zipspinner); final Spinner cityspinner = (Spinner) findViewById(R.id.cityspinner); String city_values[] = new String[]{"Please select a state."}; adapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, city_values); adapter2.setDropDownViewResource(R.layout.city_spinner_layout); cityspinner.setAdapter(adapter2); JSONArray jsonArray; final JSONArray cityArray; try { String spinnerContentType = "state"; String spinnerURL = "getStoreState.php"; String spinner_data = DataCall.getJSON(spinnerURL, spinnerContentType); jsonArray = new JSONArray(spinner_data); final String[] array_spinner = new String[jsonArray.length()]; for (int i = 0; i < jsonArray.length(); i++) { String styleValue = jsonArray.getJSONArray(i).getString(0); array_spinner[i] = styleValue; } ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, array_spinner); adapter.setDropDownViewResource(R.layout.state_spinner_layout); zipspinner.setAdapter(adapter); zipspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { int item = zipspinner.getSelectedItemPosition(); String item_value = array_spinner[item]; String spinnerContentType = "city"; String spinnerURL = "getStoreCity.php?state=" + item_value; String city_data = DataCall.getJSON(spinnerURL, spinnerContentType); cityArray = new JSONArray(city_data); //The final local variable cityArray cannot be assigned, since it is defined in an enclosing type final String[] city_spinner = new String[cityArray.length()]; for (int i = 0; i < cityArray.length(); i++) { String styleValue = cityArray.getJSONArray(i).getString(0); //Unhandled exception type JSONException city_spinner[i] = styleValue; } city_values = city_spinner; //Unhandled exception type JSONException adapter2.notifyDataSetChanged(); } public void onNothingSelected(AdapterView parent { // Do nothing. } }); } catch (JSONException e) { e.printStackTrace(); } } } 

ahora intenta

Bueno, así es como voy a sugerir,

En primer lugar compruebe que está obteniendo valores en city_values . A continuación, notifique al adaptador …. adapter2.notifyDataSetChanged(); Y finalmente cityspinner.setSelection(0);

 UPDATE: 

Yo sugeriría trake ArrayList<String> instead of String[]

Gracias…

Declare la variable city_array en el lugar donde se asigna un new JSONArray() . De todos modos lo está utilizando temporalmente. Simplemente vuelva a ajustar el adaptador.

  • Ayuda con la sincronización de la selección del hilador
  • Cómo obtener Spinner valor del elemento seleccionado a la cadena?
  • Personalización de la fuente de spinner
  • Android: Selección de spinner alineada a la izquierda
  • Android - ¿Cómo puedo cambiar un valor de spinner sin activar setOnItemSelectedListener
  • Spinner se inicializa cuando empieza mi actividad - Android
  • Establecer TextSize a un texto en spinner en android programatically
  • Cómo cambiar el color del texto del hilandero
  • Spinner onItemSelected llamado erróneamente (sin acción del usuario)
  • No se puede escribir en el campo de entrada después de cargar una página con InAppBrowser y la carga del hilador
  • Creación de un setError () para el Spinner
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.