package com.chudiangameplay.android.dialog; import android.app.Dialog; import android.content.Context; import android.content.res.AssetManager; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StyleRes; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.WindowManager; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.chudiangameplay.android.R; import com.chudiangameplay.android.interface_.CommCallBack; import com.chudiangameplay.android.tool.CommToast; import com.chudiangameplay.android.ui.view.citypiker.adapter.ArrayWheelAdapter; import com.chudiangameplay.android.ui.view.citypiker.adapter.NumericWheelAdapter; import com.chudiangameplay.android.ui.view.citypiker.model.CityModel; import com.chudiangameplay.android.ui.view.citypiker.model.DistrictModel; import com.chudiangameplay.android.ui.view.citypiker.model.ProvinceModel; import com.chudiangameplay.android.ui.view.citypiker.service.XmlParserHandler; import com.chudiangameplay.android.ui.view.citypiker.widget.OnWheelChangedListener; import com.chudiangameplay.android.ui.view.citypiker.widget.WheelView; import com.chudiangameplay.android.util.AnimUtil; import com.chudiangameplay.android.util.StatusBarUtil_Dialog; import java.io.InputStream; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; /** * Created by Administrator on 2018/7/29. */ public class ProvinceSelectDialog extends Dialog implements OnWheelChangedListener, View.OnClickListener { Context context; public ProvinceSelectDialog(@NonNull Context context) { super(context); this.context = context; } public ProvinceSelectDialog(@NonNull Context context, @StyleRes int themeResId, CommCallBack callback) { super(context, themeResId); this.context = context; this.callback = callback; } protected ProvinceSelectDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) { super(context, cancelable, cancelListener); this.context = context; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_provinceselect_wheel); initView(); initData(); StatusBarUtil_Dialog.setImmersiveStatusBar(this, true); } CommCallBack callback; public static final int VISIBLE_ITEMS = 7; private WheelView mViewProvince; private WheelView mViewCity; private WheelView mViewDistrict; TextView tv_cancel, tv_ok; LinearLayout ll_content; View view_bg; protected String[] mProvinceDatas; protected Map<String, String[]> mCitisDatasMap = new HashMap<String, String[]>(); protected Map<String, String[]> mDistrictDatasMap = new HashMap<String, String[]>(); protected Map<String, String> mZipcodeDatasMap = new HashMap<String, String>(); protected String mCurrentProviceName;//当前省 protected String mCurrentCityName;//当前城市 protected String mCurrentDistrictName = "";//当前区县 private void initView() { ll_content = (LinearLayout) findViewById(R.id.ll_content); view_bg = findViewById(R.id.view_bg); tv_cancel = findViewById(R.id.tv_cancel); tv_ok = findViewById(R.id.tv_ok); tv_cancel.setOnClickListener(this); tv_ok.setOnClickListener(this); view_bg.setOnClickListener(this); ll_content.setOnClickListener(this); AnimUtil.fadeIn(view_bg); AnimUtil.fadeIn(ll_content); mViewProvince = (WheelView) findViewById(R.id.id_province); mViewProvince.setVisibleItems(VISIBLE_ITEMS); mViewCity = (WheelView) findViewById(R.id.id_city); mViewDistrict = (WheelView) findViewById(R.id.id_district); mViewProvince.addChangingListener(this); mViewCity.addChangingListener(this); mViewDistrict.addChangingListener(this); } private void initData() { initProvinceDatas(); mViewProvince.setViewAdapter(new ArrayWheelAdapter<String>(context, mProvinceDatas)); mViewProvince.setVisibleItems(7); mViewCity.setVisibleItems(7); mViewDistrict.setVisibleItems(7); updateCities(); updateAreas(); // if(!TextUtils.isEmpty(SPUtil.getStringValue(SPUtil.SP_ADDRESS,null))) { // updateView(SPUtil.getStringValue(SPUtil.SP_ADDRESS,null)); // } } protected void initProvinceDatas() { List<ProvinceModel> provinceList = null; AssetManager asset = context.getAssets(); try { InputStream input = asset.open("province_data.xml"); SAXParserFactory spf = SAXParserFactory.newInstance(); 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(); // mCurrentZipCode = districtList.get(0).getZipcode(); } } mProvinceDatas = new String[provinceList.size()]; for (int i = 0; i < provinceList.size(); i++) { mProvinceDatas[i] = provinceList.get(i).getName(); 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.put(districtList.get(k).getName(), districtList.get(k).getZipcode()); distrinctArray[k] = districtModel; distrinctNameArray[k] = districtModel.getName(); } mDistrictDatasMap.put(cityNames[j], distrinctNameArray); } mCitisDatasMap.put(provinceList.get(i).getName(), cityNames); } } catch (Throwable e) { e.printStackTrace(); } finally { } } //修改视图 private void updateView(String address) { if (!address.contains("-")) { return; } String province = address.split("-")[0]; String city = address.split("-")[1]; String district; if (address.split("-").length > 2) { district = address.split("-")[2]; } else { district = "其他"; } List<ProvinceModel> provinceList = null; AssetManager asset = context.getAssets(); try { InputStream input = asset.open("province_data.xml"); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser parser = spf.newSAXParser(); XmlParserHandler handler = new XmlParserHandler(); parser.parse(input, handler); input.close(); provinceList = handler.getDataList(); // mProvinceDatas = new String[provinceList.size()]; for (int i = 0; i < provinceList.size(); i++) { if (provinceList.get(i).getName().contains(province)) { mViewProvince.setCurrentItem(i); mCurrentProviceName = provinceList.get(i).getName(); List<CityModel> cityList = provinceList.get(i).getCityList(); for (int j = 0; j < cityList.size(); j++) { if (cityList.get(j).getName().contains(city)) { mViewCity.setCurrentItem(j); mCurrentCityName = cityList.get(j).getName(); List<DistrictModel> districtList = cityList.get(j).getDistrictList(); for (int k = 0; k < districtList.size(); k++) { if (districtList.get(k).getName().contains(district)) { mViewDistrict.setCurrentItem(k); mCurrentDistrictName = districtList.get(k).getName(); } } } } } } } catch (Throwable e) { e.printStackTrace(); } finally { } } private void updateCities() { int pCurrent = mViewProvince.getCurrentItem(); mCurrentProviceName = mProvinceDatas[pCurrent]; String[] cities = mCitisDatasMap.get(mCurrentProviceName); if (cities == null) { cities = new String[]{""}; } mViewCity.setViewAdapter(new ArrayWheelAdapter<String>(context, cities)); mViewCity.setCurrentItem(0); updateAreas(); } private void updateAreas() { int pCurrent = mViewCity.getCurrentItem(); mCurrentCityName = mCitisDatasMap.get(mCurrentProviceName)[pCurrent]; String[] areas = mDistrictDatasMap.get(mCurrentCityName); if (areas == null) { areas = new String[]{""}; } mViewDistrict.setViewAdapter(new ArrayWheelAdapter<String>(context, areas)); mViewDistrict.setCurrentItem(0); mCurrentDistrictName = mDistrictDatasMap.get(mCurrentCityName)[0]; // mCurrentZipCode = mZipcodeDatasMap.get(mCurrentDistrictName); } @Override public void onChanged(WheelView wheel, int oldValue, int newValue) { if (wheel == mViewProvince) { updateCities(); } else if (wheel == mViewCity) { updateAreas(); } else if (wheel == mViewDistrict) { mCurrentDistrictName = mDistrictDatasMap.get(mCurrentCityName)[newValue]; // mCurrentZipCode = mZipcodeDatasMap.get(mCurrentDistrictName); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_ok: if (callback != null) { callback.onResult(mCurrentProviceName + " " + mCurrentCityName + " " + mCurrentDistrictName); } dismissWithAnim(); break; case R.id.tv_cancel: dismissWithAnim(); break; case R.id.view_bg: dismissWithAnim(); break; case R.id.ll_content: //不处理,只消耗点击事件 break; } } public void dismissWithAnim() { if (view_bg.getAnimation() != null) return; AnimUtil.fadeOut(ll_content, null); AnimUtil.fadeOut(view_bg, new CommCallBack() { @Override public void onResult(Object obj) { dismiss(); } }); } }