android 省市区选择器

来源:互联网 发布:三网合一网络箱 编辑:程序博客网 时间:2024/06/05 06:09

选择dialog

/** * 区域选择Dialog * Created by 梅西 on 2016/7/27. */public class DialogAreaChose extends Dialog implements View.OnClickListener, OnWheelScrollListener {    private PickerScrollView scrollProvince, scrollCity, scrollDistrict;    private Context context;    private String[] mProvinceDatas;//所有省    private AreaChoseListener areaChoseListener;    private Map<String, String[]> mCitisDatasMap = new HashMap<>();//key - 省 value - 市    private Map<String, String[]> mDistrictDatasMap = new HashMap<>(); //key - 市 values - 区    private String mCurrentProviceName;//当前省的名称    private String mCurrentCityName;//当前市的名称    private String mCurrentDistrictName = "";//当前区的名称    public DialogAreaChose(Context context, AreaChoseListener areaChoseListener) {        super(context);        this.context = context;        this.areaChoseListener = areaChoseListener;    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.dialog_area_chose);        Window window = getWindow();        if (window != null) {            window.setGravity(Gravity.BOTTOM);//设置Dialog在底部显示            window.setBackgroundDrawableResource(android.R.color.transparent);//设置背景透明            window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);//设置横向全屏            window.setWindowAnimations(R.style.dialog_share);        }        initProvinceDatas();//初始化地区信息        init();//初始化    }    private void init() {        TextView tvBack = (TextView) findViewById(R.id.area_chose_cancel);        TextView tvFinish = (TextView) findViewById(R.id.area_chose_finish);        scrollProvince = (PickerScrollView) findViewById(R.id.area_chose_province);        scrollCity = (PickerScrollView) findViewById(R.id.area_chose_city);        scrollDistrict = (PickerScrollView) findViewById(R.id.area_chose_district);        scrollProvince.setViewAdapter(new ArrayWheelAdapter<>(                context, mProvinceDatas));        // 设置可见条目数量        scrollProvince.setVisibleItems(5);        scrollCity.setVisibleItems(5);        scrollDistrict.setVisibleItems(5);        updateCities();        updateAreas();        scrollProvince.addScrollingListener(this);        scrollCity.addScrollingListener(this);        scrollDistrict.addScrollingListener(this);        tvBack.setOnClickListener(this);        tvFinish.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.area_chose_cancel:    //取消                this.dismiss();                break;            case R.id.area_chose_finish:    //完成                areaChoseListener.onClick(mCurrentProviceName, mCurrentCityName, mCurrentDistrictName);                this.dismiss();                break;        }    }    //解析区域XMl文件    private void initProvinceDatas() {        List<ProvinceModel> provinceList;        AssetManager asset = context.getAssets();        try {            InputStream input = asset.open("area_data.xml");            // 创建一个解析xml的工厂对象            SAXParserFactory spf = SAXParserFactory.newInstance();            // 解析xml            SAXParser parser = spf.newSAXParser();            XmlParserHandler handler = new XmlParserHandler();            parser.parse(input, handler);            input.close();            // 获取解析出来的数据            provinceList = handler.getDataList();            //*/ 初始化默认选中的省、市、区            if (provinceList != null && !provinceList.isEmpty()) {                mCurrentProviceName = provinceList.get(0).getName();                List<CityModel> cityList = provinceList.get(0).getCityList();                if (cityList != null && !cityList.isEmpty()) {                    mCurrentCityName = cityList.get(0).getName();                    List<DistrictModel> districtList = cityList.get(0).getDistrictList();                    mCurrentDistrictName = districtList.get(0).getName();                }            }            if (provinceList != null) {                mProvinceDatas = new String[provinceList.size()];                for (int i = 0; i < provinceList.size(); i++) {                    // 遍历所有省的数据                    mProvinceDatas[i] = provinceList.get(i).getName();                    Log.v("lgq","所以省。。。。。。"+mProvinceDatas[i]+i);                    List<CityModel> cityList = provinceList.get(i).getCityList();                    String[] cityNames = new String[cityList.size()];                    for (int j = 0; j < cityList.size(); j++) {                        // 遍历省下面的所有市的数据                        cityNames[j] = cityList.get(j).getName();                        List<DistrictModel> districtList = cityList.get(j).getDistrictList();                        String[] distrinctNameArray = new String[districtList.size()];//                        DistrictModel[] distrinctArray = new DistrictModel[districtList.size()];                        for (int k = 0; k < districtList.size(); k++) {                            // 遍历市下面所有区/县的数据                            DistrictModel districtModel = new DistrictModel(districtList.get(k).getName(), districtList.get(k).getZipcode());                            // 区/县对于的邮编,保存到mZipcodeDatasMap//                            distrinctArray[k] = districtModel;                            distrinctNameArray[k] = districtModel.getName();                        }                        // 市-区/县的数据,保存到mDistrictDatasMap                        mDistrictDatasMap.put(cityNames[j], distrinctNameArray);                    }                    // 省-市的数据,保存到mCitisDatasMap                    mCitisDatasMap.put(provinceList.get(i).getName(), cityNames);                }            }        } catch (Throwable e) {            e.printStackTrace();        }    }    /**     * 根据当前的市,更新区WheelView的信息     */    private void updateAreas() {        int pCurrent = scrollCity.getCurrentItem();        mCurrentCityName = mCitisDatasMap.get(mCurrentProviceName)[pCurrent];        String[] areas = mDistrictDatasMap.get(mCurrentCityName);        if (areas == null) {            areas = new String[]{""};        }        scrollDistrict                .setViewAdapter(new ArrayWheelAdapter<>(context, areas));        scrollDistrict.setCurrentItem(0);    }    /**     * 根据当前的省,更新市WheelView的信息     */    private void updateCities() {        int pCurrent = scrollProvince.getCurrentItem();        mCurrentProviceName = mProvinceDatas[pCurrent];        String[] cities = mCitisDatasMap.get(mCurrentProviceName);        if (cities == null) {            cities = new String[]{""};        }        scrollCity.setViewAdapter(new ArrayWheelAdapter<>(context, cities));        scrollCity.setCurrentItem(0);        updateAreas();    }    @Override    public void onScrollingStarted(PickerScrollView wheel) {    }    @Override    public void onScrollingFinished(PickerScrollView wheel) {        if (wheel == scrollProvince) {            updateCities();        } else if (wheel == scrollCity) {            updateAreas();        } else if (wheel == scrollDistrict) {            mCurrentDistrictName = mDistrictDatasMap.get(mCurrentCityName)[wheel                    .getCurrentItem()];        }    }    public interface AreaChoseListener {        void onClick(String privince, String city, String district);    }}
添加 area_date.xml 到asset

<root>    <province name="安徽省">        <city name="安庆市">            <district name="枞阳县" zipcode="246000" />            <district name="大观区" zipcode="246000" />            <district name="怀宁县" zipcode="246000" />            <district name="潜山县" zipcode="246000" />            <district name="宿松县" zipcode="246000" />            <district name="太湖县" zipcode="246000" />            <district name="桐城市" zipcode="246000" />            <district name="望江县" zipcode="246000" />            <district name="宜秀区" zipcode="246000" />            <district name="迎江区" zipcode="246000" />            <district name="岳西县" zipcode="246000" />            <district name="其他" zipcode="246000" />        </city>        <city name="蚌埠市">            <district name="蚌山区" zipcode="233000" />            <district name="固镇县" zipcode="233000" />            <district name="怀远县" zipcode="233000" />            <district name="淮上区" zipcode="233000" />            <district name="龙子湖区" zipcode="233000" />            <district name="五河县" zipcode="233000" />            <district name="禹会区" zipcode="233000" />            <district name="其他" zipcode="233000" />        </city>        <city name="亳州市">            <district name="利辛县" zipcode="236000" />            <district name="蒙城县" zipcode="236000" />            <district name="谯城区" zipcode="236000" />            <district name="涡阳县" zipcode="236000" />            <district name="其他" zipcode="236000" />        </city>        <city name="巢湖市">            <district name="含山县" zipcode="238000" />            <district name="和县" zipcode="238000" />            <district name="居巢区" zipcode="238000" />            <district name="庐江县" zipcode="238000" />            <district name="无为县" zipcode="238000" />            <district name="其他" zipcode="238000" />        </city>        <city name="池州市">            <district name="东至县" zipcode="247100" />            <district name="贵池区" zipcode="247100" />            <district name="青阳县" zipcode="247100" />            <district name="石台县" zipcode="247100" />            <district name="其他" zipcode="247100" />        </city>

demo 下载地址 http://pan.baidu.com/s/1gf9psRL

eclipse 下载地址  http://pan.baidu.com/s/1clJePK

原创粉丝点击