天气预报--查询其他城市天气功能实现
来源:互联网 发布:水性互穿网络防腐面漆 编辑:程序博客网 时间:2024/05/18 09:17
Spinner的使用:
要在Spinner中显示中国所有的省份,这就要将数据和控件联系起来,这里我用了Adapter,Adapter我认为是数据和控件之间的桥梁,数据在adapter中做处理,然后显示到控件上面。Adapter有很多种,这个项目我用的是ArrayAdapter,数组适配器。
<span style="font-size:14px;">ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.province, android.R.layout.simple_spinner_item);</span>有三个参数,第一个参数是当前Activity的上下文对象,第二个是你所要显示的数据来源,从createFromResource我们可以很清楚的知道这个方法的意思,我的数据放在xml文件中
<span style="font-size:14px;"> <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>台湾</item> <item>香港</item> <item>澳门</item> </string-array></span>
,第三个参数是下拉菜单的样式,我选择的是系统自带的样式,它只有一个TextView,我用它来显示上面的Item,如果有别的需要,例如加载图片什么的,可以自定义一个XML文件,写好布局再用R.layout.XXX引用就好。
这样,第一个Spinner就设置好了。
然后第二个Spinner设置就有些难度,因为需要他的数据源根据第一个选择的省份而变化,我采取的方法是将第一个Spinner的数据源省份对应的市区,按顺序的存放进一张数据库的表中,根据第一个Spinner所选择的Item的Id去数据库中寻找对应值。
首先,需要将第一个Spinner绑定一个监听器:
<span style="font-size:14px;">province.setOnItemSelectedListener(this);</span>这样当Spinner的Item被选中时会调用如下方法:
<span style="font-size:14px;">public void onItemSelected(AdapterView<?> parent, View view, int position,long id)</span>参考API文档后,知道第一个参数parent是发生选中事件的AbsListView,是个View对象(注:在这里则是选中的那个spinner),第二个参数是AbsListView中被选中的视图,也是个View对象,个人理解是在上面定义的
<span style="font-size:14px;">android.R.layout.simple_spinner_item</span>这个样式中的TextView对象,第三个参数是视图在Spinner中的位置,按顺序由第一个0,1,2,3....依次排下来的,我就按照这个position在数据库中建表的。第四个参数的被点击条目的行ID,这个参数我暂时不清楚有什么用,输出的并不是和position一一对应的,用的不多。
数据库表的名字是Province
<span style="font-size:14px;">db.execSQL("INSERT INTO Province (_id, area) VALUES(?, ?)", new Object[]{0, "市区"});db.execSQL("INSERT INTO Province (_id, area) VALUES(?, ?)", new Object[]{1, "市区,合肥,巢湖,蚌埠,安庆,六安,滁州,马鞍山,阜阳,宣城,铜陵,淮北,芜湖,毫州,宿州,淮南,池州"});</span>表结构是_id,area,_id为对应第一个Spinner的Item的Id,例如第一个Spinner的第二个Item是合肥,position刚好为1,我就得到了第二个Spinner的数据。
新建了一个List来存放这个得到的数据:private List<String> areas = new ArrayList<String>();
<span style="font-size:14px;">MySQLiteDatabase sqLite = new MySQLiteDatabase(this);/**sqLite中存放了对应ID的市级名字,是一个数据库对象*/sqLite.getAerasList(position + "", areas);/**position为选中id数字,转换为字符形式,然后根据position这个id*//**找到sqLite中对应id的所有市,再将这些市存放进areas这个list对象中*/</span>getAerasList是Datebase的一个自定义方法:
<span style="font-size:14px;">public void getAerasList(String _id, List<String> areasList) {// 查询相应_id的信息cursor = db.rawQuery("SELECT * FROM Province WHERE _id=?", new String[] { _id });// 清空ListareasList.clear();// 为List添加数据if (cursor.moveToFirst()) {String areaStr = cursor.getString(cursor.getColumnIndex("area"));String[] areasStr = areaStr.split(",");for (String area : areasStr) {areasList.add(area);}}}</span>可以看到areaStr为一个String对象,它存放的就是刚刚读取出的“XX,XX,XX,XX”的字符串,而areasStr为String对象的数组,数组的每一行存放的是areaStr以逗号为分隔符分开的城市名字,然后一行一行的添加进areasList这个ArrayList对象中,关键是如何实现分割分隔符两边的内容,查找了相关资料得知String.split方法的签名是
public string[] split(string regex) ,参数regex的意思是一个正则表达式,而不是我之前以为的简单的分隔符,它对一些特殊字符的处理,例如“.” "|" "+"等字符必须在前面加“\\”,例如String.split("\\.");这样才能正确的分隔开,而我表中的分隔符是中文的“,”,故可以直接使用“,”作为分隔符。
最后得到了我们所需信息的areas,就可以new出一个Adapter为第二个Spinner加载数据了:private ArrayAdapter<String> spnInfoAdapter = new ArrayAdapter<String>(QueryOtherCity.this,android.R.layout.simple_spinner_item, areas);
provinceInfo.setAdapter(spnInfoAdapter);//provinceInfo为第二个Spinner用这个provinceInfo.getSelectedItem().toString();得到第二个Spinner选择内容的字符串,根据这个市区的字符串,去存放城市和id的表中获取到城市ID也不是一件太难的事情了。
db.execSQL("CREATE TABLE IF NOT EXISTS CityId (_id integer primary key autoincrement,area text,cityid integer)");值得一提的是,在CityId表中存数据同样是用了解析Json方法,这是我要被解析的数据
jsonObject,keys():获取到Json数据所有键的对象。
private String cityIdJson = "{\"北京\":\"101010100\",\"朝阳\":\"101010300\",\"顺义\":\"101010400\"," +"\"怀柔\":\"101010500\",\"通州\":\"101010600\",\"昌平\":\"101010700\",\"延庆\":\"101010800\"," +
.........
JSONObject jsonObject =new JSONObject(cityIdJson);
Iterator keyIter = jsonObject.keys(); String keyName;
String info;
for(;keyIter.hasNext();){
<span style="white-space:pre"></span>keyName = keyIter.next().toString(); //获取键名info = jsonObject.getString(keyName); //获取键值db.execSQL("INSERT INTO CityId (area, cityid) VALUES(?, ?)", new Object[]{keyName,info});
}
而后获取到ID后的操作,就和查询广州城市一样了,不再赘述。
0 0
- 天气预报--查询其他城市天气功能实现
- 天气预报功能--查询广州天气的实现
- android listview实现快速查询A—Z (模拟一些天气搜狐,网易等天气预报)
- android listview实现快速查询A—Z (模拟一些天气搜狐,网易等天气预报)
- android listview实现快速查询A—Z (模拟一些天气搜狐,网易等天气预报)
- 【Java】-利用天气查询API实现天气预报小窗体应用程序(一)
- 天气预报--保存已查询城市,历史记录功能实现
- 天气预报--保存已查询城市,历史记录功能实现
- 浅谈PHP调用接口实现天气查询功能
- Android实现天气预报(中国天气网)
- Android实现天气预报(中国天气网)
- python 实现天气预报功能
- 实现天气预报功能
- c++实现查询天气预报
- c++实现查询天气预报
- c++实现查询天气预报
- c++实现查询天气预报
- VB实现天气查询
- Unix/Linux环境C编程入门教程(32) 环境变量那些事儿
- 归并排序(分治思想)
- 找出一个二维数组中的“鞍点”,即该位置上的元素在该行中最大,在该列中最小(也可能没鞍点),打印出有关信息。
- ajax jquery 上传文件
- cocos2d-x 实现跨平台的目录遍历
- 天气预报--查询其他城市天气功能实现
- HDU 2015 偶数求和
- poj 3264 线段树/RMQ(区间最大减最小)
- Light OJ 1231(背包dp)
- “Hello world!”
- Unix/Linux环境C编程入门教程(34) 编程管理系统中的用户
- ASP.NET MVC 视图(三)
- 百度员工离职总结:如何做个好员工
- 加快开发时间的8个CSS的预处理程序