//兩個下拉列表Spinner的關聯 public class MainActivity extends Activity { private Spinner provice_sp; private Spinner city_sp; private ArrayAdapter<String> provice_adapter; private ArrayAdapter<String> city_adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); provice_sp = (Spinner) this.findViewById(R.id.provice_sp); city_sp = (Spinner) this.findViewById(R.id.city_sp); // 從xml文件中加載數據給適配器綁定數據 XmlPullParser parser = getResources().getXml(R.xml.citys_weather); final Map<String, List<String>> dataMap = parserXMLData(parser); // 建適配器//加載省份的spinner數據 Set<String> set = dataMap.keySet();// 省份做爲鍵值 // 由於適配器不能放集合,但能夠放list數組,因此轉換爲list List<String> provicelist = new ArrayList<String>(set); provice_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, provicelist); provice_sp.setAdapter(provice_adapter);// 關聯綁定適配器 city_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); // 城市先不給數據源,先關聯綁定適配器,數據下面再給 city_sp.setAdapter(city_adapter); // 設置監聽,點擊省份的時候產生事件 provice_sp.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 這裏addAll會報錯,改版本就行,它是高版本的,因此要改版本號 city_adapter.clear();// 每次都清空前面點擊後添加的內容,不然他會累積 // 法1 String name = parent.getSelectedItem().toString(); // 法2://String name=provice_adapter.getItem(position); // 法3://String // name=parent.getItemAtPosition(position).toString(); city_adapter.addAll(dataMap.get(name));//省名做爲鍵,經過鍵就能夠得到該省的城市 } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } private Map<String, List<String>> parserXMLData(XmlPullParser parser) { Map<String, List<String>> map = new HashMap<String, List<String>>(); List<String> citylist = null; try { int event = parser.getEventType(); while (event != XmlPullParser.END_DOCUMENT) { switch (event) { case XmlPullParser.START_DOCUMENT: break; // 注意START_DOCUMENT只執行一次,因此不能在這裏實例化城市,由於p循環調用的 case XmlPullParser.START_TAG: if ("p".equals(parser.getName())) { // 進入時實例化城市集合 citylist = new ArrayList<String>(); } if ("pn".equals(parser.getName())) { map.put(parser.nextText(), citylist);// list在後面再加 } if ("d".equals(parser.getName())) { citylist.add(parser.nextText()); } break; case XmlPullParser.END_TAG: if ("p".equals(parser.getName())) { citylist = null; } break; } event = parser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return map; } } //佈局文件:相對佈局 <Spinner android:id="@+id/provice_sp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" /> <Spinner android:id="@+id/city_sp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/provice_sp" android:text="" /> //文件citys_weather.xml <citylist> <p p_id = "01"> <pn>北京</pn> <c c_id="0101"><cn>北京</cn> <d d_id="101010100">北京</d> <d d_id="101010200">海淀</d> <d d_id="101010300">朝陽</d> <d d_id="101010400">順義</d> <d d_id="101010500">懷柔</d> <d d_id="101010600">通州</d> <d d_id="101010700">昌平</d> <d d_id="101010800">延慶</d> <d d_id="101010900">豐臺</d> <d d_id="101011000">石景山</d> <d d_id="101011100">大興</d> <d d_id="101011200">房山</d> <d d_id="101011300">密雲</d> <d d_id="101011400">門頭溝</d> <d d_id="101011500">平谷</d> </c> </p> <p p_id = "02"> <pn>上海</pn> <c c_id="0201"><cn>上海</cn> <d d_id="101020100">上海</d> <d d_id="101020200">閔行</d> <d d_id="101020300">寶山</d> <d d_id="101020500">嘉定</d> <d d_id="101020600">浦東南匯</d> <d d_id="101020700">金山</d> <d d_id="101020800">青浦</d> <d d_id="101020900">松江</d> <d d_id="101021000">奉賢</d> <d d_id="101021100">崇明</d> <d d_id="101021200">徐家彙</d> <d d_id="101021300">浦東</d> </c> </p> </citylist>