🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
请尊重他人的劳动成果,转载请注明出处:[Android开发之解析XML并实现三级联动效果](http://blog.csdn.net/fengyuzhengfan/article/details/39560427) 本实例主要应用XmlPullParser解析XML文档中的省市区,然后将数据绑定到Spinner上实现三级联动的效果。关于XmlPullParser的详解大家可以参考《[Android开发之使用PULL解析和生成XML](http://blog.csdn.net/fengyuzhengfan/article/details/39560595)》一文。 运行效果图: ![省市区三级联动](https://box.kancloud.cn/2016-02-19_56c6aa377f4a5.jpg) ![省市区三级联动](https://box.kancloud.cn/2016-02-19_56c6aa3791bba.jpg) ![省市区三级联动](https://box.kancloud.cn/2016-02-19_56c6aa37aa213.jpg) 程序代码: 核心代码: ~~~ <pre name="code" class="java">package com.jph.sevice; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.xmlpull.v1.XmlPullParser; import android.os.Handler; import android.os.Message; import android.util.Xml; /** * 解析省、市、区xml * @author jph * Date:2014.09.25 */ public class PullProvince { public static final int PARSESUCCWSS=0x2001; private Handler handler; public PullProvince(Handler handler) { // TODO Auto-generated constructor stub this.handler=handler; } /** * 获取所有省份城市以及区 * @author jph * Date:2014.09.25 */ public void getProvinces(final InputStream inStream) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { XmlPullParser pullParser = Xml.newPullParser(); pullParser.setInput(inStream, "UTF-8"); int event; event = pullParser.getEventType(); Map<String, Map<String, List<String>>> provinces = new HashMap<String, Map<String, List<String>>>();// 省份 Map<String, List<String>> cities=null;// 城市 ArrayList<String> areaAll = null; String pName = "";// 省份名称 String cName = "";// 城市名称 String aName = "";// 地区名 String targetName = "";// 当前节点的名称 while (event != XmlPullParser.END_DOCUMENT) { targetName = pullParser.getName(); switch (event) { case XmlPullParser.START_TAG: if ("province".equals(targetName)) {// 处理省份节点 pName = pullParser.getAttributeValue(0);// 当前省份名 cities=new HashMap<String, List<String>>(); } else if ("city".equals(targetName)) {// 处理城市节点 cName = pullParser.getAttributeValue(0); areaAll = new ArrayList<String>();// 地区 } else if ("area".equals(targetName)) {// 处理地区节点 aName = pullParser.getAttributeValue(0); } break; case XmlPullParser.END_TAG: if (targetName.equals("area")) { areaAll.add(aName); } else if (targetName.equals("city")) { cities.put(cName, areaAll); } else if (targetName.equals("province")) { provinces.put(pName, cities); } break; } event = pullParser.next(); } Message message=new Message(); message.obj=provinces;//将解析出的数据放到message中传给主线程 message.what=PARSESUCCWSS; handler.sendMessage(message);//通知主线程数据解析完毕 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } } ~~~ Activity: ~~~ <pre name="code" class="java">package com.jph.px; import java.io.InputStream; import java.util.List; import java.util.Map; import com.jph.sevice.PullProvince; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.Toast; /** * 省,市,区三级联动 * @author jph * Date:2014.09.25 */ public class MainActivity extends Activity { private Spinner province,city,area; private Map<String, Map<String, List<String>>> data=null; /**当前的选择的省份**/ private String currentProvince; /**当前的选择的城市**/ private String currentCity; private PullProvince pullProvince; // /**当前的选择的区**/ // private String currentArea; private Handler mHandler=new Handler(){ @SuppressWarnings("unchecked") @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (msg.what) { case PullProvince.PARSESUCCWSS://数据解析完毕,加载数据 data=(Map<String, Map<String, List<String>>>) msg.obj; initData(); break; default: break; } super.handleMessage(msg); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); province=(Spinner)findViewById(R.id.province); city=(Spinner)findViewById(R.id.city); area=(Spinner)findViewById(R.id.area); pullProvince=new PullProvince(mHandler); InputStream inStream = this.getClass().getClassLoader(). getResourceAsStream("province_city.xml"); pullProvince.getProvinces(inStream); } /** * 初始化数据 */ private void initData(){ if (data!=null) { String[]arrStrings= data.keySet().toArray(new String[0]); System.out.println(arrStrings); //将省份信息填充到 province Spinner province.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,arrStrings)); currentProvince=getCurrentProvince(); bindCityAdapter(currentProvince); currentCity=getCurrentCity(); bindAreaAdapter(currentCity); setOnItemSelectedListener(); } } private void bindAreaAdapter(String currentCity) { // TODO Auto-generated method stub //根据当前显示的城市将对应的区填充到area Spinner area.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, data.get(currentProvince).get(currentCity))); } private void bindCityAdapter(String currentProvince) { // TODO Auto-generated method stub //根据当前显示的省份将对应的城市填充到city Spinner city.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,data. get(currentProvince).keySet().toArray(new String[0]))); } /** * 为Spinner设置监听器 */ private void setOnItemSelectedListener() { // TODO Auto-generated method stub province.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub currentProvince=getCurrentProvince(); bindCityAdapter(currentProvince); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); city.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub currentCity=getCurrentCity(); bindAreaAdapter(currentCity); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); area.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this,area.getSelectedItem().toString(), Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); } /**获取当前选择的省份 * @return String:当前选择的省份 */ private String getCurrentProvince() { // TODO Auto-generated method stub return province.getSelectedItem().toString(); } /**获取当前选择的城市 * @return String:当前选择的城市 */ private String getCurrentCity() { // TODO Auto-generated method stub return city.getSelectedItem().toString(); } } ~~~ 布局文件: ~~~ <pre name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Spinner android:id="@+id/province" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Spinner android:id="@+id/city" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Spinner android:id="@+id/area" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> ~~~