这篇是我刚接触安卓半个月写的 不推荐看 写的太臭了 这会在实习 等我有空改改
先上张图让大家看一看布局的方式
示意图上写的非常清楚了,横向listview里边再加一个横向的scrollview,需要注意的就是触摸事件的分发,我是通过ev.getY来判断高度来区别响应ListView本身的滑动还是ScrollView的滑动。
在这里我只是分点的把一些讲一下,看完再去看程序源码绝对轻松简单。
首先,你得有全国的省市的ID和名字,通过城市ID来从API获取天气数据
http://blog.csdn.net/d_dmelon/article/details/51361416
这本身就是个Activity,可以用startActivityforResult来启动,并且返回城市的Name和ID,通过id访问接口,获取该城市的天气情况。
然后就是怎么获取天气,我用的是这个接口,地址最后边的数字是城市id,北京的ID是101010100,如下
http://wthrcdn.etouch.cn/weather_mini?citykey=101010100
数据如下:
{ "desc":"OK", "status":1000, "data": { "wendu":"26", "ganmao":"各项气象条件适宜,无明显降温过程,发生感冒机率较低。", "forecast": [ {"fengxiang":"无持续风向", "fengli":"微风级", "high":"高温 29℃", "type":"晴", "low":"低温 15℃", "date":"19日星期四" }, {"fengxiang":"无持续风向", "fengli":"微风级", "high":"高温 30℃", "type":"晴", "low":"低温 15℃", "date":"20日星期五" }, {"fengxiang":"无持续风向","fengli":"微风级","high":"高温 30℃", "type":"晴","low":"低温 15℃","date":"21日星期六" }, {"fengxiang":"无持续风向","fengli":"微风级","high":"高温 28℃", "type":"多云","low":"低温 17℃","date":"22日星期天" }, {"fengxiang":"无持续风向","fengli":"微风级","high":"高温 25℃", "type":"阴","low":"低温 15℃","date":"23日星期一" } ], "yesterday": { "fl":"微风","fx":"无持续风向","high":"高温 29℃","type":"晴","low":"低温 18℃","date":"18日星期三" }, "aqi":"137", "city":"北京" } }12345678910111213141516171819202122232425262728293031323334353637383940411234567891011121314151617181920212223242526272829303132333435363738394041
有了数据,就得显示吧,解析上边的JSON数据看看我们能获取什么有用的信信息。当天温度(wendu),和接下来5天的感冒、风向,风力、高低温、天气情况(type)。天气情况用图片显示,其他的用文字描述。这样我们要在listview里存的data已经很明确了。
资源文件的resID Int型 和 天气情况的文字描述 String型。
所以data应该是个HashMap
HashMapitem = new HashMap (); item.put("ftype",Rfirpng);// String ,Int item.put("stype",Rsecpng); item.put("ttype",Rthrpng); item.put("fotype",Rfoupng); item.put("fitype",Rfifpng); item.put("name",strName); item.put("ID",strID); item.put("wendu",wendu);//String ,String item.put("fengxiang",fengxiang); item.put("ganmao",ganmao); item.put("finfo",finfo); item.put("sinfo",sinfo); item.put("tinfo",tinfo); item.put("foinfo",foinfo); item.put("fiinfo",fiinfo); mainList.add(item); saveListData();123456789101112131415161718123456789101112131415161718
String[] Keys = new String[]{"ftype","ftype","stype","ttype","fotype","fitype" ,"name","wendu","fengxiang","ganmao","finfo","sinfo","tinfo","foinfo","fiinfo"}; int[] Ids = new int[]{R.id.pngtype,R.id.firpng,R.id.secpng,R.id.thrpng,R.id.foupng,R.id.fifpng ,R.id.text_name,R.id.text_wendu,R.id.text_fengxiang,R.id.text_ganmao ,R.id.firdayinfo,R.id.secdayinfo,R.id.thrdayinfo,R.id.foudayinfo,R.id.fifdayinfo}; mainAdapter = new SimpleAdapter(this,mainList,R.layout.weather,Keys,Ids); // mAdapter = new HorizontalSimpleAdapter(this,mainList,R.layout.weather,Keys,Ids); mainListView.setAdapter(mainAdapter); // mainListView.setAdapter(mAdapter);1234567891012345678910
恩恩,到这里就差不多能显示了,但天气预报不仅仅如此,看到我上边贴出来的代码里 saveListData这个函数,是不是很奇怪啊,这就是接下来我要说的,通过SharedPreferences来保存天气信息和是否第一次进入(如果要扩展,以后做过第一次进入的引导界面也是OK的)。
那么到底要保存哪些信息?
1是Json解析出来我们要显示的图片的resID和文字描述。
2是是否第一次进入,布尔值,如果第一次进入默认网络请求加载北京市的城市天气
3是上次我们申请刷新天气的时间,如果没有这个判断,你过几天再登进去看就是过时的信息啦哈哈
public void saveListData(){ //保存数据 SharedPreferences.Editor editor = getSharedPreferences("ArrayData",MODE_PRIVATE).edit(); SharedPreferences getData = getSharedPreferences("ArrayData",MODE_PRIVATE); // int oldSize =getData.getInt("NUMBER",0); editor.putInt("NUMBER",mainList.size());//已有的Item数目 for(int i=0;i public boolean Isfirst(){ SharedPreferences settings = getSharedPreferences("data",MODE_PRIVATE); Boolean First = settings.getBoolean("IsFirstIn",true);//没有字段则为第一次进入 return First; }123456123456有save肯定有get啦
public void getListData(){ //获取数据 SharedPreferences getData = getSharedPreferences("ArrayData",MODE_PRIVATE); int Size =getData.getInt("NUMBER", 0);//若取不到NUMBER值 则默认为0 if(checkUpdate()) { for (int i = 0; i < Size; i++) { strID = getData.getString("Item"+i+"ID","NULL"); strName = getData.getString("Item"+i+"name","NULL"); WeatherUrl = WEATHER_URL + strID; sendRequestWithHttpURLConnection(); try{ Thread.sleep(200); }catch (Exception e ){e.printStackTrace();} } } else{ for(int i=0;iitem = new HashMap (); item.put("today",getData.getInt("Item"+i+"today",R.drawable.daxue)); item.put("ftype",getData.getInt("Item"+i+"ftype",R.drawable.daxue)); item.put("stype",getData.getInt("Item"+i+"stype",R.drawable.daxue)); item.put("ttype",getData.getInt("Item"+i+"ttype",R.drawable.daxue)); item.put("fotype",getData.getInt("Item"+i+"fotype",R.drawable.daxue)); item.put("fitype",getData.getInt("Item"+i+"fitype",R.drawable.daxue)); item.put("name",getData.getString("Item"+i+"name","NULL")); item.put("ID",getData.getString("Item"+i+"ID","NULL")); item.put("wendu",getData.getString("Item"+i+"wendu","NULL")); item.put("fengxiang",getData.getString("Item"+i+"fengxiang","NULL")); item.put("ganmao",getData.getString("Item"+i+"ganmao","NULL")); item.put("finfo",getData.getString("Item"+i+"finfo","NULL")); item.put("sinfo",getData.getString("Item"+i+"sinfo","NULL")); item.put("tinfo",getData.getString("Item"+i+"tinfo","NULL")); item.put("foinfo",getData.getString("Item"+i+"foinfo","NULL")); item.put("fiinfo",getData.getString("Item"+i+"fiinfo","NULL")); mainList.add(item); } } }1234567891011121314151617181920212223242526272829303132333435363738394012345678910111213141516171819202122232425262728293031323334353637383940 知识有限,存取的方法可能比较low,不过功能倒是实现了~~
源码源码
APK地址