android在代码中利用Spinner控件设置联动地区的解决办法
来源:互联网 发布:软件项目成果 编辑:程序博客网 时间:2024/05/16 17:17
需求就是地区选择可以弹出来,因为百度地图一般是获取当前的地址,我们需要的是他的家庭地址 所以才有了三级Spinner解决
地区问题 就是当用户填写了之后,下次再修改,你要给他显示出来上次填写的值,由于是联动的比较麻烦
首先是要搞定地区的问题,一般是用array来设置 这里面我只贴一部分
<!-- 含个省、自治区、直辖市 --> <string-array name="province_item"> <item>不限地区</item> <item>北京</item> <item>天津</item> <item>河北</item> <item>山西</item> <item>内蒙古</item> <item>辽宁</item> <item>吉林</item> <item>黑龙江</item> <item>上海</item> <item>江苏</item> <item>浙江</item> <item>安徽</item> <item>福建</item> <item>江西</item> <item>山东</item> <item>河南</item> <item>湖北</item> <item>湖南</item> <item>广东</item> <item>广西</item> <item>海南</item> <item>重庆</item> <item>四川</item> <item>贵州</item> <item>云南</item> <item>西藏</item> <item>陕西</item> <item>甘肃</item> <item>青海</item> <item>宁夏</item> <item>新疆</item> </string-array> <!-- 个地级市 --> <string-array name="unlimited_province_item"> <item>不限地区</item> </string-array> <string-array name="beijin_province_item"> <item>北京</item> </string-array> <string-array name="tianjin_province_item"> <item>天津</item> </string-array> <string-array name="heibei_province_item"> <item>石家庄</item> <item>唐山</item> <item>秦皇岛</item> <item>邯郸</item> <item>邢台</item> <item>保定</item> <item>张家口</item> <item>承德</item>
然后把这个东西搞成一个类来装
public class ResourceData {public static final int[] city = { R.array.beijin_province_item, R.array.tianjin_province_item, R.array.heibei_province_item,R.array.shanxi1_province_item, R.array.neimenggu_province_item, R.array.liaoning_province_item,R.array.jilin_province_item, R.array.heilongjiang_province_item, R.array.shanghai_province_item,R.array.jiangsu_province_item, R.array.zhejiang_province_item, R.array.anhui_province_item,R.array.fujian_province_item, R.array.jiangxi_province_item, R.array.shandong_province_item,R.array.henan_province_item, R.array.hubei_province_item, R.array.hunan_province_item,R.array.guangdong_province_item, R.array.guangxi_province_item, R.array.hainan_province_item,R.array.chongqing_province_item, R.array.sichuan_province_item, R.array.guizhou_province_item,R.array.yunnan_province_item, R.array.xizang_province_item, R.array.shanxi2_province_item,R.array.gansu_province_item, R.array.qinghai_province_item, R.array.linxia_province_item,R.array.xinjiang_province_item };}
这里面只写一部分了 多个地级市,县城你自己加吧
接下来就是代码中搞定了:
要准备一个函数:
private void select(Spinner spin, ArrayAdapter<CharSequence> adapter, int arry,int position) {adapter = ArrayAdapter.createFromResource(context, arry, R.drawable.drop_list_hover);adapter.setDropDownViewResource(R.drawable.drop_list_ys);spin.setAdapter(adapter);spin.setSelection(position, true);}
这个函数的功能就是给一个 Spinner进行初始化把,参数分别是Spinner对象,适配器,数据集,默认位置
因为在设置联动的时候都是根据上一个Spinner选择的值 id来决定下一个Spinner的值
接下来就先贴代码了
private void loadAddsSpinner() {province_spinner = (Spinner) findViewById(R.id.province_spinner);province_spinner.setPrompt("请选择省份");province_adapter = ArrayAdapter.createFromResource(context, R.array.province_item,R.drawable.drop_list_hover);province_adapter.setDropDownViewResource(R.drawable.drop_list_ys);province_spinner.setAdapter(province_adapter);province_spinner.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {provinceId = province_spinner.getSelectedItemPosition();strProvince = province_spinner.getSelectedItem().toString();city_spinner = (Spinner) findViewById(R.id.city_spinner);if (true) {Log.v("test", "province: " + province_spinner.getSelectedItem().toString() + provinceId.toString());county_spinner = (Spinner) findViewById(R.id.county_spinner);city_spinner = (Spinner) findViewById(R.id.city_spinner);city_spinner.setPrompt("请选择城市");select(city_spinner, city_adapter, ResourceData.city[provinceId],sposition);city_spinner.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {cityId = city_spinner.getSelectedItemPosition();strCity = city_spinner.getSelectedItem().toString();Log.v("test", "city: " + city_spinner.getSelectedItem().toString() + cityId.toString());if (true) {county_spinner = (Spinner) findViewById(R.id.county_spinner);county_spinner.setPrompt("请选择县区");switch (provinceId) {case 0:select(county_spinner, county_adapter, ResourceData.countyOfBeiJing[cityId],xianposition);break;case 1:select(county_spinner, county_adapter, ResourceData.countyOfTianJing[cityId],xianposition);break;case 2:select(county_spinner, county_adapter, ResourceData.countyOfHeBei[cityId],xianposition);break;case 3:select(county_spinner, county_adapter, ResourceData.countyOfShanXi1[cityId],xianposition);break;case 4:select(county_spinner, county_adapter, ResourceData.countyOfNeiMengGu[cityId],xianposition);break;case 5:select(county_spinner, county_adapter, ResourceData.countyOfLiaoNing[cityId],xianposition);break;case 6:select(county_spinner, county_adapter, ResourceData.countyOfJiLin[cityId],xianposition);break;case 7:select(county_spinner, county_adapter, ResourceData.countyOfHeiLongJiang[cityId],xianposition);break;case 8:select(county_spinner, county_adapter, ResourceData.countyOfShangHai[cityId],xianposition);break;case 9:select(county_spinner, county_adapter, ResourceData.countyOfJiangSu[cityId],xianposition);break;case 10:select(county_spinner, county_adapter, ResourceData.countyOfZheJiang[cityId],xianposition);break;case 11:select(county_spinner, county_adapter, ResourceData.countyOfAnHui[cityId],xianposition);break;case 12:select(county_spinner, county_adapter, ResourceData.countyOfFuJian[cityId],xianposition);break;case 13:select(county_spinner, county_adapter, ResourceData.countyOfJiangXi[cityId],xianposition);break;case 14:select(county_spinner, county_adapter, ResourceData.countyOfShanDong[cityId],xianposition);break;case 15:select(county_spinner, county_adapter, ResourceData.countyOfHeNan[cityId],xianposition);break;case 16:select(county_spinner, county_adapter, ResourceData.countyOfHuBei[cityId],xianposition);break;case 17:select(county_spinner, county_adapter, ResourceData.countyOfHuNan[cityId],xianposition);break;case 18:select(county_spinner, county_adapter, ResourceData.countyOfGuangDong[cityId],xianposition);break;case 19:select(county_spinner, county_adapter, ResourceData.countyOfGuangXi[cityId],xianposition);break;case 20:select(county_spinner, county_adapter, ResourceData.countyOfHaiNan[cityId],xianposition);break;case 21:select(county_spinner, county_adapter, ResourceData.countyOfChongQing[cityId],xianposition);break;case 22:select(county_spinner, county_adapter, ResourceData.countyOfSiChuan[cityId],xianposition);break;case 23:select(county_spinner, county_adapter, ResourceData.countyOfGuiZhou[cityId],xianposition);break;case 24:select(county_spinner, county_adapter, ResourceData.countyOfYunNan[cityId],xianposition);break;case 25:select(county_spinner, county_adapter, ResourceData.countyOfXiZang[cityId],xianposition);break;case 26:select(county_spinner, county_adapter, ResourceData.countyOfShanXi2[cityId],xianposition);break;case 27:select(county_spinner, county_adapter, ResourceData.countyOfGanSu[cityId],xianposition);break;case 28:select(county_spinner, county_adapter, ResourceData.countyOfQingHai[cityId],xianposition);break;case 29:select(county_spinner, county_adapter, ResourceData.countyOfNingXia[cityId],xianposition);break;case 30:select(county_spinner, county_adapter, ResourceData.countyOfXinJiang[cityId],xianposition);default:break;}county_spinner.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {strCounty = county_spinner.getSelectedItem().toString();if (strProvince.equals(strCity)) {xiangxiadd.setText(strProvince + strCounty);region = strProvince + "," + strCounty;xiangxiaddress = region +","+xiangxiaddress;//详细地址加上前缀} else {xiangxiadd.setText(strProvince + strCity + strCounty);region = strProvince + "," + strCity + "," + strCounty;xiangxiaddress = region +","+xiangxiaddress;//详细地址加上前缀}}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {}});}}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {// TODO Auto-generated method stub}});}}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {}});}
这里面最重要的就是select代码了 注意最后一个参数的作用 position 他就是用来设置默认值的
后面就简单了,分析从服务器中返回的数据,判断是哪个id 变成position就好了
我的是这样做的,可能还有人更坚定,我感觉我的稍显负责
//省市县String ssxStr = element.optString("ind_origin2");if(ssxStr!=null || ssxStr !="" || ssxStr!="null"){String[] ss = ssxStr.split(",");Log.i("Wusheng", ss.length+"-----322125");if(ss.length == 2){province_spinner.setSelection(initProSpinner(ss[0]), true);int proInt = initProSpinner(ss[0]);int cityInt = initCitySpinner(proInt,ss[0]);sposition = cityInt;provinceId = proInt;cityId = cityInt;int xianInt = initCountSpinner(proInt,sposition,ss[1]);xianposition = xianInt;//Log.i("Wusheng",ResourceData.city[initProSpinner(ss[0])]);}else if(ss.length == 3){Log.i("Wusheng", initProSpinner(ss[0])+"322125");province_spinner.setSelection(initProSpinner(ss[0]), true);int proInt = initProSpinner(ss[0]);int cityInt = initCitySpinner(proInt,ss[1]);sposition = cityInt;provinceId = proInt;cityId = cityInt;//接下来通过省,市的代码去找到县的代码int xianInt = initCountSpinner(proInt,sposition,ss[2]);Log.i("Wusheng",xianInt+"-----44---322125");xianposition = xianInt;}}
这里面是异步进程handler里面的处理省 市县的代码 为什么切分之后分为两种呢,因为我们有北京 重庆这样的特殊省份
根据省的名称返回省的代码:
/** * 根据省名称返回 下标值 * @param proStr * @return */public int initProSpinner(String proStr){String[] pros=this.getResources().getStringArray(R.array.province_item);for(int i=0;i<pros.length;i++){if(proStr.equals(pros[i])){return i;}}return 0;}
看客不要太在意我定义了那么多int变量啊,因为怕写错了,所以分的比较清楚,后面的很多int都去掉了,
/** * 根据省代码 来获取 市的代码 * @param proInt * @param string * @return */public int initCitySpinner(int proInt, String citStr) {// TODO Auto-generated method stubString[] citys=this.getResources().getStringArray(ResourceData.city[proInt]);for(int i=0;i<citys.length;i++){if(citStr.equals(citys[i])){return i;}}return 0;}
根据省代码去获取 市的代码,你可能会认为,为什么上面不根据名称直接去获取市的代码,那你想多了,你可以看看我的根据array构造数组的时候怎么调用id值的
/** * 根据省 市代码 来获取 县的代码 * @param sposition2 * @param string * @return */public int initCountSpinner(int proint,int sposition2, String countStr) {// TODO Auto-generated method stubString[] citys= null;switch (proint) {case 0:citys = this.getResources().getStringArray(ResourceData.countyOfBeiJing[sposition2]);break;case 1:citys = this.getResources().getStringArray(ResourceData.countyOfTianJing[sposition2]);break;case 2:citys = this.getResources().getStringArray(ResourceData.countyOfHeBei[sposition2]);break;case 3:citys = this.getResources().getStringArray(ResourceData.countyOfShanXi1[sposition2]);break;case 4:citys = this.getResources().getStringArray(ResourceData.countyOfNeiMengGu[sposition2]);break;case 5:citys = this.getResources().getStringArray(ResourceData.countyOfLiaoNing[sposition2]);break;case 6:citys = this.getResources().getStringArray(ResourceData.countyOfJiLin[sposition2]);break;case 7:citys = this.getResources().getStringArray(ResourceData.countyOfHeiLongJiang[sposition2]);break;case 8:citys = this.getResources().getStringArray(ResourceData.countyOfShangHai[sposition2]);break;case 9:citys = this.getResources().getStringArray(ResourceData.countyOfJiangSu[sposition2]);break;case 10:citys = this.getResources().getStringArray(ResourceData.countyOfZheJiang[sposition2]);break;case 11:citys = this.getResources().getStringArray(ResourceData.countyOfAnHui[sposition2]);break;case 12:citys = this.getResources().getStringArray(ResourceData.countyOfFuJian[sposition2]);break;case 13:citys = this.getResources().getStringArray(ResourceData.countyOfJiangXi[sposition2]);break;case 14:citys = this.getResources().getStringArray(ResourceData.countyOfShanDong[sposition2]);break;case 15:citys = this.getResources().getStringArray(ResourceData.countyOfHeNan[sposition2]);break;case 16:citys = this.getResources().getStringArray(ResourceData.countyOfHuBei[sposition2]);break;case 17:citys = this.getResources().getStringArray(ResourceData.countyOfHuNan[sposition2]);break;case 18:citys = this.getResources().getStringArray(ResourceData.countyOfGuangDong[sposition2]);break;case 19:citys = this.getResources().getStringArray(ResourceData.countyOfGuangXi[sposition2]);break;case 20:citys = this.getResources().getStringArray(ResourceData.countyOfHaiNan[sposition2]);break;case 21:citys = this.getResources().getStringArray(ResourceData.countyOfChongQing[sposition2]);break;case 22:citys = this.getResources().getStringArray(ResourceData.countyOfSiChuan[sposition2]);break;case 23:citys = this.getResources().getStringArray(ResourceData.countyOfGuiZhou[sposition2]);break;case 24:citys = this.getResources().getStringArray(ResourceData.countyOfYunNan[sposition2]);break;case 25:citys = this.getResources().getStringArray(ResourceData.countyOfXiZang[sposition2]);break;case 26:citys = this.getResources().getStringArray(ResourceData.countyOfShanXi2[sposition2]);break;case 27:citys = this.getResources().getStringArray(ResourceData.countyOfGanSu[sposition2]);break;case 28:citys = this.getResources().getStringArray(ResourceData.countyOfQingHai[sposition2]);break;case 29:citys = this.getResources().getStringArray(ResourceData.countyOfNingXia[sposition2]);break;case 30:citys = this.getResources().getStringArray(ResourceData.countyOfXinJiang[sposition2]);default:break;}for(int i=0;i<citys.length;i++){if(countStr.equals(citys[i])){return i;}}return 0;}
这个地方就稍微县的臃肿了,那位看客又更好的方法没有,中国低级县区太多了,至少有2800个左右吧,我也想不出来怎么用代码更好的找到每个县的代码
到此基本就完成了认为,运行下就解决了问题
其中解析那里用的是 当前类的私有变量 不用多说了
0 0
- android在代码中利用Spinner控件设置联动地区的解决办法
- android在代码中设置Spinner默认选中的值
- Android开发之在代码中给控件设置颜色不起作用的解决办法
- Android 在代码中设置控件在RelativeLayout的位置
- android 中spinner 二级联动
- android 中spinner 三级联动
- Android中在代码中设置控件的宽和高
- fragment 中利用spinner实现省市联动
- Android在代码中设置控件的drawableLeft等
- 封装好的省市地区联动控件
- Android 在代码中设置控件属性
- Android中Spinner控件及级联Spinner的使用
- 地区三级联动代码
- android开发中spinner控件的使用
- Android中控件spinner的使用
- Android中Spinner控件的使用
- android 中spinner 实现三级联动
- Android 代码中设置控件的style
- 最简单的基于SlidingMenu仿QQ侧滑效果
- Maven环境搭建入门Hello World
- android在代码中设置Spinner默认选中的值
- UVa1411-Ants
- How to Improve Speed Reading Skills
- android在代码中利用Spinner控件设置联动地区的解决办法
- iOS9 3DTouch开发 知识点详解
- JAVA类与对象学习笔记
- 怎样存钱利最大
- hdu 2126 Buy the souvenirs
- hdu1860
- Java判断数字是否为整数
- Altium designer的简单学习
- 【FAQ】Mac下,执行sed命令报错:“command c expects \ followed by text”,怎么办?