Android 中实现省市区的联动,在收货地址选择中用到

本文介绍了如何在Android应用中实现省市区的联动选择功能。首先解析XML文件获取省的数据,利用Pull解析器并在START_TAG中初始化和添加数据。接着,创建三个Spinner分别代表省、市、区,并设置监听器,根据省、市的选择动态更新区的显示。详细代码位于项目的res-〉raw文件夹内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现省市区的联动有两步:

0:第一步解析XML文件得到省的列表,当然了之前还需要创建省,市,区的实体类

使用Pull解析的时候,在START_TAG里面进行初始化,在END_TAG里面进行添加和重新赋值为null,
还有要注意的是最底层的节点<d> 在END_TAG里面是获取不到的,需要在START_TAG里面来进行添加和重新复制为null

1:第二步添加3个Spinner,代表省,市,区,然后实现通过省的选择控制市的显示,然后通过市的选择控制区的显示。就是给省,市添加setOnItemSelectedListener的监听方法,然后在回调中更新spinner 的数据,然后更新显示。


代码:Android 中省市区的联动


xml文件在代码里面的res-〉raw 文件夹里面

主体的代码:

package tech.androidstudio.provincecitydistrictdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

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

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

import tech.androidstudio.provincecitydistrictdemo.entity.City;
import tech.androidstudio.provincecitydistrictdemo.entity.District;
import tech.androidstudio.provincecitydistrictdemo.entity.Province;

public class MainActivity extends AppCompatActivity implements  AdapterView.OnItemSelectedListener {

    Spinner province_spinner;
    Spinner city_spinner;
    Spinner district_spinner;

    ArrayList<String> province_list;
    ArrayList<String> city_list;
    ArrayList<String> district_list;
    private ArrayList<Province> mProvinceList;
    private ArrayAdapter<String> province_adapter;
    private ArrayAdapter<String> city_adapter;
    private ArrayAdapter<String> district_adapter;

    //下面的两个参数用来标记选择的是哪一个省和城市,其实可以不用cityNumber    private int provinceNumber;
//    private int cityNumber;

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

        try {
            mProvinceList = getList();
            Log.d("Kodulf", "list " + mProvinceList.toString());
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //初始化 province         province_spinner =(Spinner)findViewById(R.id.spinner_province);
        province_list= new ArrayList<String>();
        for(int i=0;i<mProvinceList.size();i++){
            province_list.add(mProvinceList.get(i).getProvinceName());
        }
        province_adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,province_list);
        province_spinner.setAdapter(province_adapter);

        //初始化 city 城市
        city_spinner =(Spinner)findViewById(R.id.spinner_city);
        city_list= new ArrayList<String>();
        for(int i=0;i<mProvinceList.get(0).getCityList().size();i++){
            city_list.add(mProvinceList.get(0).getCityList().get(i).getCityName());
        }
        city_adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,city_list);
        city_spinner.setAdapter(city_adapter);

        //初始化 district         district_spinner =(Spinner)findViewById(R.id.spinner_district);
        district_list= new ArrayList<String>();
        for(int i=0;i<mProvinceList.get(0).getCityList().get(0).getDistrictList().size();i++){
            district_list.add(mProvinceList.get(0).getCityList().get(0).getDistrictList().get(i).getDistrictName());
        }
        district_adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,district_list);
        district_spinner.setAdapter(district_adapter);


        //然后给provincecity 添加监听器,distrcit 就不需要了,
        //TODO 注意了,如果这个Spinner 里面只有一个数据,例如北京的 city 只有北京,那么是不会出发onItemSelecte的的事件的
        province_spinner.setOnItemSelectedListener(this);
        city_spinner.setOnItemSelectedListener(this);
        //district_spinner.setOnItemSelectedListener(this);
    }


    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        Log.d("Kodulf", "Click " + "parent=" + parent.toString() + " view=" + view.toString() + "position =" + position + " long id=" + id);
        int spinnerId = parent.getId();
        switch (spinnerId){
            case R.id.spinner_province:
                Log.d("Kodulf", "Province");
                //选择省以后,开始更新市的列表,并且设置provinceNumber的值
                provinceNumber=position;
                city_list.clear();
                for (int i=0;i<mProvinceList.get(position).getCityList().size();i++){
                    city_list.add(mProvinceList.get(position).getCityList().get(i).getCityName());
                }
                city_adapter.notifyDataSetChanged();

                //同时更新区,获取这个省的第一个市的信息,然后更新。
                district_list.clear();
                for (int i = 0; i < mProvinceList.get(position).getCityList().get(0).getDistrictList().size(); i++) {
                    district_list.add(mProvinceList.get(position).getCityList().get(0).getDistrictList().get(i).getDistrictName());
                }
                district_adapter.notifyDataSetChanged();

                break;
            case R.id.spinner_city:
                Log.d("Kodulf", "City");
                //选择市以后,开始更新区的列表,可以设置或者不设置cityNumber=position;

                district_list.clear();
                for (int i = 0; i < mProvinceList.get(provinceNumber).getCityList().get(position).getDistrictList().size(); i++) {
                    district_list.add(mProvinceList.get(provinceNumber).getCityList().get(position).getDistrictList().get(i).getDistrictName());
                }
                district_adapter.notifyDataSetChanged();

                break;
            case R.id.spinner_district:
                Log.d("Kodulf", "District");
                break;
        }
    }

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



//Pull解析XML文件。
    public ArrayList<Province> getList() throws XmlPullParserException, IOException {
        ArrayList<Province> provinceList= new ArrayList<Province>();
        Province province=null;
        ArrayList<City> cityList=null;
        City city=null;
        ArrayList<District> districtList=null;
        District district = null;

        //使用Pull解析
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser xmlPullParser = factory.newPullParser();
        //文件 在Raw文件夹里面
        InputStream inputStream = getResources().openRawResource(R.raw.citys_weather);
        xmlPullParser.setInput(inputStream, "utf-8");
        //开始解析
        int eventType = xmlPullParser.getEventType();
        while (eventType!=XmlPullParser.END_DOCUMENT){
            switch (eventType){
                case XmlPullParser.START_DOCUMENT:
                    Log.d("Kodulf","Start Document");
                    break;
                case XmlPullParser.START_TAG:
                    String nodeName = xmlPullParser.getName();
                    if("p".equals(nodeName)){
                        province= new Province();
                        cityList= new ArrayList<City>();//创建Province 的时候就要创建 这个CityList
//                        <p p_id = "01">
//                        <pn>北京</pn>
                        int attributeCount = xmlPullParser.getAttributeCount();
                        for (int i = 0; i < attributeCount; i++) {
                            String attributeName = xmlPullParser.getAttributeName(i);
                            if("p_id".equals(attributeName))
                                province.setProvinceId(xmlPullParser.getAttributeValue(i));
                        }
                    }else if("pn".equals(nodeName)){
                        String provinceName = xmlPullParser.nextText();
                        if(provinceName!=null){
                            province.setProvinceName(provinceName);
                        }
                    }else if("c".equals(nodeName)){
                        //<c c_id="0101">
//                        <cn>北京</cn>
                        city = new City();
                        districtList = new ArrayList<District>();//这个不能少。
                        int attributeCount = xmlPullParser.getAttributeCount();
                        for (int i = 0; i < attributeCount; i++) {
                            String attributeName = xmlPullParser.getAttributeName(i);
                            if("c_id".equals(attributeName))
                                city.setCityId(xmlPullParser.getAttributeValue(i));
                        }
                    }else if("cn".equals(nodeName)){
                        String cityName = xmlPullParser.nextText();
                        if(cityName!=null){
                            city.setCityName(cityName);
                        }
                    }else if("d".equals(nodeName)){
                        //<d d_id="101010101">北京</d>
                        district = new District();

                        int attributeCount = xmlPullParser.getAttributeCount();
                        for (int i = 0; i < attributeCount; i++) {
                            String attributeName = xmlPullParser.getAttributeName(i);
                            if("d_id".equals(attributeName))
                                district.setDistrictId(xmlPullParser.getAttributeValue(i));
                        }
                        String districtName = xmlPullParser.nextText();
                        if(districtName!=null)
                        district.setDistrictName(districtName);
                        //在这里直接添加
                        districtList.add(district);
                        district=null;
                    }
                    break;
                case XmlPullParser.END_TAG:
                    String nodeNameEnd = xmlPullParser.getName();
                    //TODO 怎么没有检测到 d呢?
                    if("d".equals(nodeNameEnd)){
                        Log.d("Kodulf","nodeNameEnd="+nodeNameEnd+" "+district.toString());

                    }else if("c".equals(nodeNameEnd)){
                        city.setDistrictList(districtList);
                        cityList.add(city);
                        city =null;
                    }else if("p".equals(nodeNameEnd)){
                        province.setCityList(cityList);
                        provinceList.add(province);
                        province=null;
                    }
                    break;
            }
            eventType=xmlPullParser.next();
        }

        return provinceList;
    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值