首页 > 代码库 > Android开发之解析XML并实现三级联动效果

Android开发之解析XML并实现三级联动效果

请尊重他人的劳动成果,转载请注明出处:Android开发之解析XML并实现三级联动效果

       本实例主要应用XmlPullParser解析XML文档中的省市区,然后将数据绑定到Spinner上实现三级联动的效果。关于XmlPullParser的详解大家可以参考《Android开发之使用PULL解析和生成XML》一文。

运行效果图:

省市区三级联动省市区三级联动省市区三级联动

程序代码:

核心代码:

<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=http://www.mamicode.com/null;>
布局文件:

<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>






Android开发之解析XML并实现三级联动效果