天气预报--查询其他城市天气功能实现

来源:互联网 发布:水性互穿网络防腐面漆 编辑:程序博客网 时间: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
原创粉丝点击