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