package com.mrwujay.cascade.activity; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import com.mrwujay.cascade.R; import com.mrwujay.cascade.R.id; import com.mrwujay.cascade.R.layout; import com.mrwujay.cascade.model.CityModel; import com.mrwujay.cascade.model.DistrictModel; import com.mrwujay.cascade.model.ProvinceModel; import com.mrwujay.cascade.service.XmlParserHandler; import kankan.wheel.widget.OnWheelChangedListener; import kankan.wheel.widget.WheelView; import kankan.wheel.widget.adapters.ArrayWheelAdapter; import android.os.Bundle; import android.app.Activity; import android.content.res.AssetManager; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class AddressActivity extends Activity implements OnClickListener, OnWheelChangedListener { private WheelView mViewProvince; private WheelView mViewCity; private WheelView mViewDistrict; private Button mBtnConfirm; /** * ����ʡ */ 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 =""; /** * ����ʡ������XML���� */ protected void initProvinceDatas() { List<ProvinceModel> provinceList = null; AssetManager asset = getAssets(); try { InputStream input = asset.open("province_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(); 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 mZipcodeDatasMap.put(districtList.get(k).getName(), districtList.get(k).getZipcode()); 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(); } finally { } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_address); setUpViews(); setUpListener(); setUpData(); } private void setUpViews() { mViewProvince = (WheelView) findViewById(R.id.id_province); mViewCity = (WheelView) findViewById(R.id.id_city); mViewDistrict = (WheelView) findViewById(R.id.id_district); mBtnConfirm = (Button) findViewById(R.id.btn_confirm); } private void setUpListener() { // ���change�¼� mViewProvince.addChangingListener(this); // ���change�¼� mViewCity.addChangingListener(this); // ���change�¼� mViewDistrict.addChangingListener(this); // ���onclick�¼� mBtnConfirm.setOnClickListener(this); } private void setUpData() { initProvinceDatas(); mViewProvince.setViewAdapter(new ArrayWheelAdapter<String>(AddressActivity.this, mProvinceDatas)); // ���ÿɼ���Ŀ���� mViewProvince.setVisibleItems(7); mViewCity.setVisibleItems(7); mViewDistrict.setVisibleItems(7); updateCities(); updateAreas(); } @Override public void onChanged(WheelView wheel, int oldValue, int newValue) { // TODO Auto-generated method stub if (wheel == mViewProvince) { updateCities(); } else if (wheel == mViewCity) { updateAreas(); } else if (wheel == mViewDistrict) { mCurrentDistrictName = mDistrictDatasMap.get(mCurrentCityName)[newValue]; mCurrentZipCode = mZipcodeDatasMap.get(mCurrentDistrictName); } } /** * ���ݵ�ǰ���У�������WheelView����Ϣ */ private void updateAreas() { int pCurrent = mViewCity.getCurrentItem(); mCurrentCityName = mCitisDatasMap.get(mCurrentProviceName)[pCurrent]; String[] areas = mDistrictDatasMap.get(mCurrentCityName); if (areas == null||areas.length==0) { areas = new String[] { "" }; } mViewDistrict.setViewAdapter(new ArrayWheelAdapter<String>(this, areas)); mViewDistrict.setCurrentItem(0); mCurrentDistrictName = areas[0]; mCurrentZipCode = mZipcodeDatasMap.get(mCurrentDistrictName); } /** * ���ݵ�ǰ��ʡ��������WheelView����Ϣ */ 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>(this, cities)); mViewCity.setCurrentItem(0); updateAreas(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_confirm: showSelectedResult(); break; default: break; } } private void showSelectedResult() { Toast.makeText(AddressActivity.this, "��ǰѡ��:"+mCurrentProviceName+","+mCurrentCityName+"," +mCurrentDistrictName+","+mCurrentZipCode, Toast.LENGTH_SHORT).show(); } }