ProvinceSelectDialog.java 11.7 KB
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();
            }
        });
    }
}