选择状态后,使用notifyDataSetChanged更新City Spinner

一旦用户选择州,我如何更新我的城市微调器?

这两个字段都使用DataCall.class填充,该DataCall.class返回JSON数据并将信息解析为微调器的数组。

我的下面的代码将城市adapter设置为defualt “Select State”值,一旦用户获得它应该使用notifyDataSetChanged的状态,因为城市微调器的默认数组使用新的城市名称更新。 我收到的错误在下面的代码中得到了评论。

 public class SearchActivity extends Activity{ private static final String TAG = "MyApp"; ArrayAdapter 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 (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 adapter = new ArrayAdapter (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 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(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 adapter = new ArrayAdapter(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(); } } } 

现在试试

嗯,这就是我的建议,

首先检查您是否在city_values中获取值。 然后,通知适配器…. adapter2.notifyDataSetChanged(); 最后是cityspinner.setSelection(0);

 UPDATE: 

我建议trake ArrayList instead of String[]

谢谢…

在您指定new JSONArray()的位置声明city_array变量。 无论如何,你暂时使用它。 只需再次设置适配器。