//两个下拉列表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>
转载于:https://my.oschina.net/u/2541146/blog/603642