지역 중국 도시 목록을 구문 분석하기위한 Android 보조 클래스

프로젝트를 작성할 때 때때로 중국 도시 목록, 지역 목록 및 우편 번호를 표시해야합니다. 예를 들어, 최근에 제가하고있는 일은 팝업창에 중국 도시를 표시 한 다음 두 번째 수준에 도시 및 지역 목록을 표시하고 배송 주소, 티켓을 작성할 주소 등을 모두 표시하는 것입니다. 지방과 도시의 연결. 그래서 여기에 지역 도시 xml 데이터를 구문 분석하기위한 보조 클래스를 직접 작성했습니다. 도시 연결을위한 스크롤 휠은 추후 소개 될 예정입니다.

다음은 popwindow의 예이며, 데이터를 분석하는 방법입니다.

여기에 사진 설명 쓰기


1. 첫째, 당신은 중국 지방과 도시의 데이터 목록이 필요합니다

여기에 사진 설명 쓰기

2. xml 데이터 구문 분석 시작

코드에 대한 구체적인 주석이 있으므로 하나씩 설명하지 않겠습니다.

2.1 관련 콩 준비


//城市的bean
public class CityModel {
    
    
    private String name;
    private List<DistrictModel> districtList;

    public CityModel() {
        super();
    }

    public CityModel(String name, List<DistrictModel> districtList) {
        super();
        this.name = name;
        this.districtList = districtList;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<DistrictModel> getDistrictList() {
        return districtList;
    }

    public void setDistrictList(List<DistrictModel> districtList) {
        this.districtList = districtList;
    }

    @Override
    public String toString() {
        return "CityModel [name=" + name + ", districtList=" + districtList
                + "]";
    }
}

//省份的bean
public class ProvinceModel {
    
    
    private String name;
    private List<CityModel> cityList;

    public ProvinceModel() {
        super();
    }

    public ProvinceModel(String name, List<CityModel> cityList) {
        super();
        this.name = name;
        this.cityList = cityList;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<CityModel> getCityList() {
        return cityList;
    }

    public void setCityList(List<CityModel> cityList) {
        this.cityList = cityList;
    }

    @Override
    public String toString() {
        return "ProvinceModel [name=" + name + ", cityList=" + cityList + "]";
    }

}

//区域的bean
public class DistrictModel {
    
    
    private String name;
    private String zipcode;

    public DistrictModel() {
        super();
    }

    public DistrictModel(String name, String zipcode) {
        super();
        this.name = name;
        this.zipcode = zipcode;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getZipcode() {
        return zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    @Override
    public String toString() {
        return "DistrictModel [name=" + name + ", zipcode=" + zipcode + "]";
    }

}

2.2 로컬 xml 데이터 구문 분석

public class XmlParserHelper extends DefaultHandler {
    
    

    /**
     * 存储所有的解析对象
     */
    private List<ProvinceModel> provinceList = new ArrayList<ProvinceModel>();

    public XmlParserHelper() {

    }

    public List<ProvinceModel> getDataList() {
        return provinceList;
    }

    @Override
    public void startDocument() throws SAXException {
        // 当读到第一个开始标签的时候,会触发这个方法
    }

    ProvinceModel provinceModel = new ProvinceModel();
    CityModel cityModel = new CityModel();
    DistrictModel districtModel = new DistrictModel();

    @Override
    public void startElement(String uri, String localName, String qName,
                             Attributes attributes) throws SAXException {
        // 当遇到开始标记的时候,调用这个方法
        if (qName.equals("province")) {
            provinceModel = new ProvinceModel();
            provinceModel.setName(attributes.getValue(0));
            provinceModel.setCityList(new ArrayList<CityModel>());
        } else if (qName.equals("city")) {
            cityModel = new CityModel();
            cityModel.setName(attributes.getValue(0));
            cityModel.setDistrictList(new ArrayList<DistrictModel>());
        } else if (qName.equals("district")) {
            districtModel = new DistrictModel();
            districtModel.setName(attributes.getValue(0));
            districtModel.setZipcode(attributes.getValue(1));
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // 遇到结束标记的时候,会调用这个方法
        if (qName.equals("district")) {
            cityModel.getDistrictList().add(districtModel);
        } else if (qName.equals("city")) {
            provinceModel.getCityList().add(cityModel);
        } else if (qName.equals("province")) {
            provinceList.add(provinceModel);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
    }

}

2.3 해당하는 주, 도시, 지역 등을 얻기위한 보조 카테고리를 제공합니다.

/**
 * 中国城市区域的辅助类
 */
public class ProvinceAreaHelper extends Presenter{
    private static final String TAG = "ProvinceAreaHelper";

    private Context mContext;

    /**
     * 所有省
     */
    protected String[] mProvinceDatas;

    /**
     * key - 省 value - 市
     */
    protected Map<String, String[]> mCitisDatasMap = new HashMap<String, String[]>();

    /**
     * key - 市 values - 区
     */
    protected Map<String, String[]> mDistrictDatasMap = new HashMap<String, String[]>();

    /**
     * key - 区 values - 邮编
     */
    protected Map<String, String> mZipcodeDatasMap = new HashMap<String, String>();

    /**
     * 当前省的名称
     */
    protected String mCurrentProviceName;

    /**
     * 当前市的名称
     */
    protected String mCurrentCityName;

    /**
     * 当前区的名称
     */
    protected String mCurrentDistrictName ="";

    /**
     * 当前区的邮政编码
     */
    protected String mCurrentZipCode ="";


    public ProvinceAreaHelper(Context context){
        mContext = context;
    }

    /**
     * 解析省市区的XML数据
     */
    public void initProvinceData(){
        List<ProvinceModel> provinceModelList;
        AssetManager assetManager = mContext.getAssets();
        try {
            InputStream input = assetManager.open("province_data.xml");

            //创建一个解析xml 的工厂对象
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser parser = spf.newSAXParser();
            XmlParserHelper xmlParserHelper = new XmlParserHelper();

            //开始解析xml
            parser.parse(input,xmlParserHelper);
            input.close();

            //获取解析出来的数据
            provinceModelList = xmlParserHelper.getDataList();

            //*/ 初始化默认选中的省、市、区
            if (provinceModelList!= null && !provinceModelList.isEmpty()) {
                mCurrentProviceName = provinceModelList.get(0).getName();
                List<CityModel> cityList = provinceModelList.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();
                }
            }

            if(provinceModelList!=null){
                mProvinceDatas = new String[provinceModelList.size()];

                // 遍历所有省的数据
                for (int i=0; i< provinceModelList.size(); i++) {
                    mProvinceDatas[i] = provinceModelList.get(i).getName();
                    List<CityModel> cityList = provinceModelList.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()];

                        // 遍历市下面所有区/县的数据
                        for (int k=0; k<districtList.size(); k++) {
                            DistrictModel districtModel = new DistrictModel(districtList.get(k).getName(), districtList.get(k).getZipcode());

                            // 区/县对于的邮编,保存到mZipcodeDatasMap
                            mZipcodeDatasMap.put(districtList.get(k).getName(), districtList.get(k).getZipcode());
                            distrinctNameArray[k] = districtModel.getName();
                        }

                        // 市-区/县的数据,保存到mDistrictDatasMap
                        mDistrictDatasMap.put(cityNames[j], distrinctNameArray);
                    }

                    // 省-市的数据,保存到mCitisDatasMap
                    mCitisDatasMap.put(provinceModelList.get(i).getName(), cityNames);
                }
            }

        }catch (Exception e){
            Log.e(TAG, "解析省市区的XML数据 Exception=" + e.getMessage());
            e.printStackTrace();
        }
    }

    public String[] updateCities(String provinceName){
        mCurrentProviceName = provinceName;
//        String[] cities = mCitisDatasMap.get(mCurrentProviceName);
//        if (cities == null) {
//            cities = new String[] { "" };
//        }

        return  mCitisDatasMap.get(provinceName);
    }

    public String[] updateAreas(String cityName){
        mCurrentCityName = cityName;
//        String[] areas = mDistrictDatasMap.get(mCurrentCityName);
//
//        if (areas == null) {
//            areas = new String[] { "" };
//        }

        return mDistrictDatasMap.get(cityName);
    }

    public String getmCurrentProviceName() {
        return mCurrentProviceName;
    }

    public String getmCurrentCityName() {
        return mCurrentCityName;
    }

    public String getmCurrentDistrictName() {
        return mCurrentDistrictName;
    }

    public String getmCurrentZipCode() {
        return mCurrentZipCode;
    }

    public String[] getmProvinceDatas() {
        return mProvinceDatas;
    }

    @Override
    public void onDestory() {
        mProvinceDatas = null;
        mCitisDatasMap = null;
        mDistrictDatasMap = null;
    }
 }

2.4 도우미를 호출하여 해당 데이터를 가져옵니다.

// 해당 도우미를 초기화합니다.
provinceAreaHelper = new ProvinceAreaHelper (getActivity ());

// 파싱 된 데이터를 가져옵니다.
provinceAreaHelper.initProvinceData ();

여기에 사진 설명 쓰기

provinceAreaHelper에서는 해당 상황에 따라 해당 메서드를 얻을 수 있습니다.

provinceAreaHelper의 주요 목적은 수집 된 데이터를 캡슐화하고 활동에서 직접 처리하지 않고 분리하는 것입니다. 여러 곳에서 사용할 수 있으며, 바퀴의 도시 연계도이 도우미를 사용할 수 있습니다. 더 구체적인 필요에 대해서는 특정 get 메서드를 작성하여 해당 데이터를 얻습니다.

3. 도시 목록의 주소 다운로드

내 로컬 주소를 업로드합니다.
http://download.csdn.net/detail/android_freshman/9610225

추천

출처blog.csdn.net/android_freshman/article/details/52288954