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

来源:互联网 发布:c语言求1000以内素数 编辑:程序博客网 时间:2024/05/17 17:57

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

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




0 1