<android>一个老控件Spnner解决一个bug的经历(三级联动)
来源:互联网 发布:友友贷网络贷款 编辑:程序博客网 时间:2024/05/29 19:40
一个三级联动的问题,需求原型图上是一个spnner效果,本来想用pop+listview的,但是手一哆嗦就写了三个spnner,然后就用spnner做了,后台哥们想给我传json数据把城市信息给我呢,由于数据太多,我就直接用Navicat 数据库管理将php给的.sql数据库文件转成了.db格式的,然后导入assets文件夹里,下面开始解析出来数据库的各种子id,父id,城市名,不多说了,上代码吧:
/** * 城市数据库读取 */private void cityDao() { //数据库操作 //打开数据库输出流 SQLdm s = new SQLdm(); SQLiteDatabase db = s.openDatabase(getApplicationContext()); //找到每个省 然后根据area_parent_id找到每个省对应的市 //把市添加到省集合中 再找到每个市 根据area_parent_id找到每个市对应的区 //把区添加到市集合中 //省集合 province_list = new ArrayList<>(); //找到每个省 Cursor cursor = db.rawQuery("select * from pst_area where area_deep=?", new String[]{"1"}); while (cursor.moveToNext()) { String area_id1 = cursor.getString(cursor.getColumnIndex("area_id")); //省id String name1 = cursor.getString(cursor.getColumnIndex("area_name")); String area_parent_id1 = cursor.getString(cursor.getColumnIndex("area_parent_id")); //父id 此处没有 String area_deep1 = cursor.getString(cursor.getColumnIndex("area_deep")); //一级 city_list = new ArrayList<>(); //找到每个省对应的市 当area_parent_id==area_id 条件查询 Cursor cursorr = db.rawQuery("select * from pst_area where area_parent_id=?", new String[]{area_id1}); while (cursorr.moveToNext()) { String area_id2 = cursorr.getString(cursorr.getColumnIndex("area_id")); //市id String name2 = cursorr.getString(cursorr.getColumnIndex("area_name")); String area_parent_id2 = cursorr.getString(cursorr.getColumnIndex("area_parent_id")); //父id 此处没有 String area_deep2 = cursorr.getString(cursorr.getColumnIndex("area_deep")); //二级 district_list = new ArrayList<>(); //找到每个省对应的区 当area_parent_id==area_id 条件查询 Cursor cursorrq = db.rawQuery("select * from pst_area where area_parent_id=?", new String[]{area_id2}); while (cursorrq.moveToNext()) { String area_id3 = cursorrq.getString(cursorrq.getColumnIndex("area_id")); //区id String name3 = cursorrq.getString(cursorrq.getColumnIndex("area_name")); String area_parent_id3 = cursorrq.getString(cursorrq.getColumnIndex("area_parent_id")); //父id 此处没有 String area_deep3 = cursorrq.getString(cursorrq.getColumnIndex("area_deep")); //三级 //添加至区集合 District district = new District(); //区对象 district.setArea_id(area_id3); district.setArea_name(name3); district.setArea_deep(area_deep3); district.setArea_parent_id(area_parent_id3); district_list.add(district); } //添加至市集合 City city = new City(); //市对象 city.setDistricts(district_list); city.setArea_id(area_id2); city.setArea_name(name2); city.setArea_deep(area_deep2); city.setArea_parent_id(area_parent_id2); city_list.add(city); } //添加至省集合 Province province = new Province(); //省对象 province.setCitys(city_list); province.setArea_id(area_id1); province.setArea_name(name1); province.setArea_deep(area_deep1); province.setArea_parent_id(area_parent_id1); province_list.add(province); } //将集合用sp保存起来 address_sp.setDataList("address_tag", province_list);
这种古老的查询方法确实很锻炼人,保存起来后,紧接着设置设配器和监听:
private void init(int Province_id,int City_id,int Districte_id) { arrayAdapter1 = new ArrayAdapter<Province>(AddAddressActivity.this, R.layout.support_simple_spinner_dropdown_item, province_list); arrayAdapter2 = new ArrayAdapter<City>(AddAddressActivity.this, R.layout.support_simple_spinner_dropdown_item, province_list.get(Province_id).getCitys()); arrayAdapter3 = new ArrayAdapter<District>(AddAddressActivity.this, R.layout.support_simple_spinner_dropdown_item, province_list.get(Province_id).getCitys().get(City_id).getDistricts()); province_sn.setAdapter(arrayAdapter1); city_sn.setAdapter(arrayAdapter2); county_sn.setAdapter(arrayAdapter3); province_sn.setSelection(Province_id, true); city_sn.setSelection(City_id, true); county_sn.setSelection(Districte_id, true); //省 province_sn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { AddAddressActivity.this.province = province_list.get(position); arrayAdapter2 = new ArrayAdapter<City>(AddAddressActivity.this, R.layout.support_simple_spinner_dropdown_item, province_list.get(position).getCitys()); city_sn.setAdapter(arrayAdapter2); province_postion = position; province_area_name_select = province_list.get(position).getArea_name(); province_area_id_select = province_list.get(position).getArea_id(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); //市 city_sn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { arrayAdapter3 = new ArrayAdapter<District>(AddAddressActivity.this, R.layout.support_simple_spinner_dropdown_item, AddAddressActivity.this.province.getCitys().get(position).getDistricts()); county_sn.setAdapter(arrayAdapter3); city_postion = position; city_area_name_select = province_list.get(province_postion).getCitys().get(position).getArea_name(); city_area_id_select = province_list.get(province_postion).getCitys().get(position).getArea_id(); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); //区 county_sn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) { county_postion = position; county_area_name_select = province_list.get(province_postion).getCitys().get(city_postion).getDistricts().get(position).getArea_name(); county_area_id_select = province_list.get(province_postion).getCitys().get(city_postion).getDistricts().get(position).getArea_id(); } @Override public void onNothingSelected(AdapterView<?> adapterView) { } });}
我在想这个spnner不能直接将文字设置上去,而是要通过索引,也就是province_sn.setSelection(1, true);方法给设置上去,所以设置上去之前就必须给它先设置好数据源,那么我就开始想办法,既然集合已经保存了,后台也会返回回显的城市名字,我就直接在集合里遍历循环开始找对应的key吧,代码走着:
/** * 回显地址信息 * * @param province_id * @param city_id * @param country_id */private void showLocation(String province_id, String city_id, String country_id) { for (int i = 0; i < province_list.size(); i++) { if (province_id.equals(province_list.get(i).getArea_id())) { province_sn.setSelection(i, true); for (int j = 0; j < province_list.get(i).getCitys().size(); j++) { if (city_id.equals(province_list.get(i).getCitys().get(j).getArea_id())) { city_sn.setSelection(j, true); for (int k = 0; k < province_list.get(i).getCitys().get(j).getDistricts().size(); k++) { if (country_id.equals(province_list.get(i).getCitys().get(j).getDistricts().get(k).getArea_id())) { county_sn.setSelection(k, true); } } } } } }}
当时写完这段,感觉做为一个前端好累啊,还要这么查,运行后发现这段代码并什么卵用,根本定位不到,果断就找后台去了,让后台哥们给我加了三个城市分别对应的选中的索引值字段,新字段来了,操练起来了,结果设置各种后发现只有省级是可以定位到的,市级,区级只是数据显示了,却索引位始终是0位置,并没有定位到,当时的代码:
arrayAdapter1 = new ArrayAdapter<Province>(AddAddressActivity.this, R.layout.support_simple_spinner_dropdown_item, province_list);arrayAdapter2 = new ArrayAdapter<City>(AddAddressActivity.this, R.layout.support_simple_spinner_dropdown_item, province_list.get(Province_id).getCitys());arrayAdapter3 = new ArrayAdapter<District>(AddAddressActivity.this, R.layout.support_simple_spinner_dropdown_item, province_list.get(Province_id).getCitys().get(City_id).getDistricts());province_sn.setAdapter(arrayAdapter1);city_sn.setAdapter(arrayAdapter2);county_sn.setAdapter(arrayAdapter3);province_sn.setSelection(Province_id, true);city_sn.setSelection(City_id, true);county_sn.setSelection(Districte_id, true);
左思右想代码,没问题,肯定可以的啊,项目也很紧张,各种资料翻spnner的属性和特点,查到一篇帖子是这样说的,setSelection(Province_id,true);二参如果为ture的话,会自动刷新,而且会重新走一遍
setOnItemSelectedListener监听,这时我一看setOnItemSelectedListener下的代码:
//省province_sn.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { AddAddressActivity.this.province = province_list.get(position); arrayAdapter2 = new ArrayAdapter<City>(AddAddressActivity.this, R.layout.support_simple_spinner_dropdown_item, province_list.get(position).getCitys()); city_sn.setAdapter(arrayAdapter2); province_postion = position; province_area_name_select = province_list.get(position).getArea_name(); }里面竟然又走了一遍设置市级的数据,这下就有谱了,本来是定位到的,结果市级区级又重新设置了一遍适配器,所以给人感觉就是没定位到。
后来解决办法也很简单,在onItemSelected方法里直接加了个判断,如果是回显的情况下就直接返回:
if (address_id != null) { return;}问题解决,怪自己对控件的属性了解不彻底,但是财富值+1,那是没得说的。希望对大家有帮助。
阅读全文
0 0
- <android>一个老控件Spnner解决一个bug的经历(三级联动)
- 一个老程序员的经历
- 自己做的一个 ddl 三级联动
- 一个三级联动的地址选择器
- 一个老程序员的成长经历
- Android:三级城市联动控件
- Android省市区三级联动控件
- Android省市区三级联动滚轮选择(无Bug) .
- 一个三级联动的问题 大虾帮忙啊
- 用一个表的三级联动下拉菜单
- 使用jQuery+HttpHandler+xml模拟一个三级联动的例子
- 一个很不错的省市区三级联动js封装
- 使用jQuery+HttpHandler+xml模拟一个三级联动的例子
- 分享一个JS做的省市三级联动
- 使用js实现一个地址的三级联动
- 简单的一个三级联动,望朋友们多多指点
- 一个完整(详细注释分析)的整合hibernate与struts连接数据库的三级联动
- 一个省市县三级联动的回显(带数据库)
- 模拟退火 BZOJ-3680
- 简单模拟剪刀石头布js
- 谷歌已邀请更多的测试人员
- 进程间通信(一)无名管道
- Genymotion 模拟器中安装微信
- <android>一个老控件Spnner解决一个bug的经历(三级联动)
- MVC WebApi自定义异常过滤器
- Java BigDecimal和double
- angular4项目开发中背景图片地址的引用
- Python学习笔记_字典、集合
- Button的imageEdgeInsets、titleEdgeInsets
- 【转】python格式化字符串的方法汇总
- java.io.IOException: No space left on device
- Top Journals of Computer Network & Wireless Communication