地区选择组件

转帖请注明本文出自pkxutao的博客(http://blog.csdn.net/pkxutao/article/details/22854257),请尊重他人的辛勤劳动成果,谢谢!

很多应用都会用到地区选择,有些是直接选择城市(例如大众点评、58同城等),有些是先选择省再选择城市(例如微信),这里要做的是类似微信的做法,先选择省份再选择城市。

效果图:



地区数据格式(文件为city.json,保存在assets文件夹下):



先解析出数据,保存为list:

public List<String> getProvinceList() {
		List<String> provinceList = new ArrayList<String>();// 省份
		
		String json = getData().toString();
		try {
			JSONArray data = new JSONArray(json);
			for (int i = 0; i < data.length(); i++) {
				JSONObject provinceObj = data.getJSONObject(i);
				String province = provinceObj.getString("name");//获取省份
				provinceList.add(province);//存入省份list里面
				JSONArray citys = provinceObj.getJSONArray("citys");
				List<String> cityList = new ArrayList<String>();// 相应的城市列表
				for (int j = 0; j < citys.length(); j++) {
					JSONObject cityObj = citys.getJSONObject(j);
					Iterator<String> keys = cityObj.keys();
					 while(keys.hasNext()){//遍历城市列表
						 String key = keys.next();
						 String city = cityObj.getString(key);
						 cityList.add(city);//存入城市list
						 codeMap.put(city, key);//存入一个城市为key,code为value的hashmap,这样可以通过城市获取code或者通过code获取城市
					 }
					 if (j == citys.length()-1) {
						 cityMap.put(province, cityList);//如果这个省的城市列表解析完成,就放入到一个省份为key,城市列表为value的hashmap中
					}
				}
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return provinceList;
	}
展示时,先通过getProvinceList获取省份列表,通过listview展示,当用户点击某个省份的时候,判断是否是直辖市,如果是直辖市或者只有一个城市,则直接返回,如果有一个以上城市,则通过下面代码获取城市列表展示:

public List<String> getCityList(String province) {
		
		return cityMap.get(province);
	}
,用户选择后,返回数据需要加上code,获取code函数:

public String getCode(String city){
		return codeMap.get(city);
	}
这样,在开始选择地区的那个activity通过onActivityResult接收选择的地区数据就可以了。

这里用code的原因是因为需要统一地区,例如,如果有几个终端来输入西藏,有些可能输入西藏自治区等,这样数据就不统一了,所以用code来统一数据很方便。

前端从后端接收地区时也是通过code来辨别,那么怎样把code解析成地址呢?

先通过code 获取city:

public String getCity(String code){
		getProvinceList() ;
		String city = (String)keyString(codeMap, code);
		return city;
	}
再通过city获取province(省份):

public String getProvince(String city){
			Iterator<String> it= cityMap.keySet().iterator();
	          while(it.hasNext()){
	        	  String province = it.next();
	        	  List<String> cityList = cityMap.get(province);
	        	  for (int i = 0; i < cityList.size(); i++) {
	        		  if (cityList.get(i).equals(city)) {
						return province;
					}
				}
	          }
	          return null;
	}

至此组件完成,主界面如图:




DEMO下载



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值