使用pull解析和spinner实现省市地区三级联动的效果

xml资源文件

<?xml version="1.0" encoding="UTF-8"?>
    <!--
        START_DOCUMET:第一个节点 END_DOCUMET:尾节点 START_TAG:其他的首部的节点 p pn c cn...
        END_TAG:其他的尾部的节点 </p> </c> ...
    -->
<citylist>
    <p p_id="01">
        <pn>北京</pn>
        <c c_id="0101">
            <cn>北京</cn>
            <d d_id="101010101">北京</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>

xml文件只选取了部分,完整文件包括中国的所有省市地区。

布局文件

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Spinner
        android:id="@+id/spinner01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        />

    <Spinner
        android:id="@+id/spinner02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/spinner01"
        />

    <Spinner
        android:id="@+id/spinner03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/spinner02"
        />

</RelativeLayout>

城市类

package com.example.sjliandong;

import java.util.ArrayList;
import java.util.List;

public class City {
    private String id;
    private String name;
    private List<District> districts;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public List<District> getDistricts() {
        return districts;
    }
    public void setDistricts(List<District> districts) {
        this.districts = districts;
    }
    @Override
    public String toString() {
        return name;
    }

}

地区类

package com.example.sjliandong;

public class District {
    private String id;
    private String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return name;
    }

}

省类

package com.example.sjliandong;

import java.util.*;

public class Provence {
    private String id;
    private String name;
    private List<City> citys;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public List<City> getCitys() {
        return citys;
    }
    public void setCitys(List<City> citys) {
        this.citys = citys;
    }
    @Override
    public String toString() {
        return name;
    }

}

Activity类

package com.example.sjliandong;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import android.os.Bundle;
import android.app.Activity;
import android.content.res.Resources;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class MainActivity extends Activity {
    private List<Provence> provences;
    private Provence provence;
    ArrayAdapter<Provence> adapter01;
    ArrayAdapter<City> adapter02;
    ArrayAdapter<District> adapter03;
    private Spinner spinner01, spinner02, spinner03;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        spinner01 = (Spinner) findViewById(R.id.spinner01);
        spinner02 = (Spinner) findViewById(R.id.spinner02);
        spinner03 = (Spinner) findViewById(R.id.spinner03);

        try {
            provences = getProvinces();
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        adapter01 = new ArrayAdapter<Provence>(this,
                android.R.layout.simple_list_item_1, provences);
        spinner01.setAdapter(adapter01);
        spinner01.setSelection(0, true);

        adapter02 = new ArrayAdapter<City>(this,
                android.R.layout.simple_list_item_1, provences.get(0)
                        .getCitys());
        spinner02.setAdapter(adapter02);
        spinner02.setSelection(0, true);

        adapter03 = new ArrayAdapter<District>(this,
                android.R.layout.simple_list_item_1, provences.get(0)
                        .getCitys().get(0).getDistricts());
        spinner03.setAdapter(adapter03);
        spinner03.setSelection(0, true);

        spinner01.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                provence = provences.get(position);
                adapter02 = new ArrayAdapter<City>(MainActivity.this,
                        android.R.layout.simple_list_item_1, provences.get(
                                position).getCitys());
                spinner02.setAdapter(adapter02);

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        spinner02.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                adapter03 = new ArrayAdapter<District>(MainActivity.this,
                        android.R.layout.simple_list_item_1, provence.getCitys().get(position)
                        .getDistricts());
                spinner03.setAdapter(adapter03);

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // TODO Auto-generated method stub

            }
        });
    }

    public List<Provence> getProvinces() throws XmlPullParserException,
            IOException {
        List<Provence> provinces = null;
        Provence province = null;
        List<City> citys = null;
        City city = null;
        List<District> districts = null;
        District district = null;
        Resources resources = getResources();

        InputStream in = resources.openRawResource(R.raw.citys_weather);

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser parser = factory.newPullParser();

        parser.setInput(in, "utf-8");
        int event = parser.getEventType();
        while (event != XmlPullParser.END_DOCUMENT) {
            switch (event) {
            case XmlPullParser.START_DOCUMENT:
                provinces = new ArrayList<Provence>();
                break;
            case XmlPullParser.START_TAG:
                String tagName = parser.getName();
                if ("p".equals(tagName)) {
                    province = new Provence();
                    citys = new ArrayList<City>();
                    int count = parser.getAttributeCount();
                    for (int i = 0; i < count; i++) {
                        String attrName = parser.getAttributeName(i);
                        String attrValue = parser.getAttributeValue(i);
                        if ("p_id".equals(attrName))
                            province.setId(attrValue);
                    }
                }
                if ("pn".equals(tagName)) {
                    province.setName(parser.nextText());
                }
                if ("c".equals(tagName)) {
                    city = new City();
                    districts = new ArrayList<District>();
                    int count = parser.getAttributeCount();
                    for (int i = 0; i < count; i++) {
                        String attrName = parser.getAttributeName(i);
                        String attrValue = parser.getAttributeValue(i);
                        if ("c_id".equals(attrName))
                            city.setId(attrValue);
                    }
                }
                if ("cn".equals(tagName)) {
                    city.setName(parser.nextText());
                }
                if ("d".equals(tagName)) {
                    district = new District();
                    int count = parser.getAttributeCount();
                    for (int i = 0; i < count; i++) {
                        String attrName = parser.getAttributeName(i);
                        String attrValue = parser.getAttributeValue(i);
                        if ("d_id".equals(attrName))
                            district.setId(attrValue);
                    }
                    district.setName(parser.nextText());
                    districts.add(district);
                }
                break;
            case XmlPullParser.END_TAG:
                if ("c".equals(parser.getName())) {
                    city.setDistricts(districts);
                    citys.add(city);
                }
                if ("p".equals(parser.getName())) {
                    province.setCitys(citys);
                    provinces.add(province);
                }

                break;

            }
            event = parser.next();

        }
        return provinces;
    }
}

效果:

完整项目下载地址:github spinner小练习

时间: 2024-12-20 08:57:43

使用pull解析和spinner实现省市地区三级联动的效果的相关文章

安卓使用spinner控件和pull解析实现全国省市县的三级联动

实现该功能主要有两个难点: 1.XML文件的Pull解析.由于XML文件的结构较为复杂,所以解析时要注意,划分XML文件的结构,根据结构建立相应的和集合.本例中需要建立三个类和三个对象.三个类分别为,省份类,城市类,和地区类.三个集合分别为,省份集合,城市集合,和地区集合.省份类里有该省份的城市集合,城市类里有该城市所有地区的集合,然后将所有的省份放入省份集合当中. 2.三级联动的实现方法:在Spinner1的监听选择事件中,根据用户选择的省份(position)获得该省份所对应的城市(list

地区三级联动--省份province

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>地区三级联动</title> <script src="./jquery.js"></script> </head> <body> <h2>地区三级联动</h2> 省

中国地区三级联动菜单(纯js制作)

第一步:在网页中写入如下代码: <!DOCTYPE html> <!--次行代表使用的是html5,如果不支持请换成html4--> <html> <head> <title>三级联动菜单</title><br> <script src="style/jsAddress.js"></script> <!--需要和js文件在同一目录下--> </head>

jQuery简单的省市区县三级联动案例

简单的省市区三级联动,适合初学者入门学习的案例 目录结构如下: 三级联动.html 跟 JS文件夹是同个级别 效果图如下: HTML代码: 1 <style type="text/css"> 2 *{margin:0;padding:0;} 3 .selectAll 4 { width:400px; 5 margin:100px auto; 6 } 7 </style> 8 9 <div class="selectAll"> 10

ajax省市线三级联动

<script type='text/javascript' src='http://ajax.useso.com/ajax/libs/jquery/1.7.2/jquery.min.js?ver=3.4.2'></script> <script type="text/javascript"> var xmldom=null;//声明一个全局变量,用来存储xmldocument对像 $(function(){ //加载完成立即获得省份信息 $.aja

省份地区三级联动的简单实现

在此直接导入代码,详细内容代码中有注释,相应需要引入的文件大家可以自己到相应网站下载: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <!--省份--> <select id="province" name="provinc

省份,城市,地区------三级联动菜单

模板部分代码: <form method='post' action='' id='myform' name='myform'> <dl><dt>地址</dt> <dd> <select name='prov' id='prov'> <option value=''>省份</option> <?php $prov=M('')->where($where)->order('order')->

地区三级联动实现方式

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <ti

地区三级联动

控制层: <?phpnamespace app\index\controller; use think\Controller;use think\Db; class Addr extends Controller{ public function addr(){ $one = Db::name('global_region') -> where(['parent_id' => 0]) -> select(); return view('addr',['one'=>$one])