天气预报--查询其他城市天气功能实现
2014-07-22 19:30
501 查看
Spinner的使用:
要在Spinner中显示中国所有的省份,这就要将数据和控件联系起来,这里我用了Adapter,Adapter我认为是数据和控件之间的桥梁,数据在adapter中做处理,然后显示到控件上面。Adapter有很多种,这个项目我用的是ArrayAdapter,数组适配器。
,第三个参数是下拉菜单的样式,我选择的是系统自带的样式,它只有一个TextView,我用它来显示上面的Item,如果有别的需要,例如加载图片什么的,可以自定义一个XML文件,写好布局再用R.layout.XXX引用就好。
这样,第一个Spinner就设置好了。
然后第二个Spinner设置就有些难度,因为需要他的数据源根据第一个选择的省份而变化,我采取的方法是将第一个Spinner的数据源省份对应的市区,按顺序的存放进一张数据库的表中,根据第一个Spinner所选择的Item的Id去数据库中寻找对应值。
首先,需要将第一个Spinner绑定一个监听器:
数据库表的名字是Province
新建了一个List来存放这个得到的数据:private List<String> areas = new ArrayList<String>();
最后得到了我们所需信息的areas,就可以new出一个Adapter为第二个Spinner加载数据了:
jsonObject,keys():获取到Json数据所有键的对象。
而后获取到ID后的操作,就和查询广州城市一样了,不再赘述。
要在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 }); // 清空List areasList.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后的操作,就和查询广州城市一样了,不再赘述。
相关文章推荐
- 天气预报--保存已查询城市,历史记录功能实现
- 天气预报--保存已查询城市,历史记录功能实现
- 天气预报功能--查询广州天气的实现
- Angular实现的简单查询天气预报功能示例
- 【Java】-利用天气查询API实现天气预报小窗体应用程序(一)
- android使用soap协议访问webservice实现天气预报功能
- Java中使用WebService实现简单的天气预报功能
- 微信订阅号天气预报功能的实现(java版)
- 天气预报,MYSQL之JDBC查询模块实现(代码)和简易插入模块实现(代码)以及PREPAREDSTATEMENT插入模块实现(代码)
- 安卓实现天气预报功能
- 小功能 获取天气预报 城市联动
- .net请求Webservice简单实现天气预报功能
- 基于HTML5 geolocation 实现的天气预报功能
- 微信公众平台开发应用(天气预报、股票查询、手机归属地查询、在线听音乐、翻译、成绩查询等功能)代码分享如下
- Jquery和雅虎的YQL服务实现天气预报功能!
- Web服务入门之二:通过axis2调用远程Web Service,实现天气预报功能
- 实现天气预报功能
- Jquery和雅虎的YQL服务实现天气预报功能!
- 微信公众平台实现天气预报功能
- .net请求Webservice简单实现天气预报功能