1. 程式人生 > >android 省市區選擇器

android 省市區選擇器

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