Android:一个非常非常简单的天气app
2016-08-05 00:00
836 查看
界面截图:
界面非常的简单。。。
数据来源Openweathermap和和风天气。
主要界面使用RecyclerView
在新版的RecyclerView里面,里面的item布局android:layout_height不可以为match_parent,应为这样的话,每一个item的布局的高度就是RecyclerView的高度。
以下是里面的item的布局:
这个item布局主要用来显示当前的天气状况。
这个布局主要用来显示天气预报的内容。
这个布局主要用来显示当前天气的其他数据。
adapter里面主要代码
主要是根据getItemViewType来决定显示不同的item布局。
天气数据的处理
推荐使用一个android studio的插件,gsonformat,可以根据json直接生成java对象。
当前的天气信息来自Openweathermap
大致是这样,直接可以用gsonformat插件自动生成类。
天气预报里面的数据来自和风天气,数据由来自国内和国外,以下是国外的数据
里面的数据说明可以查看官网的说明。
每次网络请求的时候,将获取到的数据直接使用gson转化成对应的类。
其他内容如果需要,以后再补充。
项目下载地址
http://www.oschina.net/code/snippet_2000932_58476
项目比较简单,有疑问欢迎
界面非常的简单。。。
数据来源Openweathermap和和风天气。
主要界面使用RecyclerView
在新版的RecyclerView里面,里面的item布局android:layout_height不可以为match_parent,应为这样的话,每一个item的布局的高度就是RecyclerView的高度。
以下是里面的item的布局:
这个item布局主要用来显示当前的天气状况。
这个布局主要用来显示天气预报的内容。
这个布局主要用来显示当前天气的其他数据。
adapter里面主要代码
public class WeatherAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private LayoutInflater mInflater; private static final int HEAD_ITEMTYPE = 100; private static final int BODY_ITEMTYPE = 101; private static final int FOOT_ITEMTYPE = 102; private static final int ADS_ITEMTYPE = 103; //admob view // private AdView gadView; //数据当前天气的数据 private ItemCurrWeatherData currWeatherData = null; //天气预报的数据 private List<ItemWeatherForecast> forecastsList; public WeatherAdapter(Context c) { context = c; mInflater = LayoutInflater.from(c); forecastsList = new ArrayList<ItemWeatherForecast>(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder viewHolder = null; if (viewType == HEAD_ITEMTYPE) { View v = mInflater.inflate(R.layout.item_main, parent, false); viewHolder = new ViewHolder1(v); } else if (viewType == BODY_ITEMTYPE) { View v = mInflater.inflate(R.layout.item_body, parent, false); viewHolder = new ViewHolder2(v); } else if (viewType == FOOT_ITEMTYPE) { View v = mInflater.inflate(R.layout.item_detail, parent, false); viewHolder = new ViewHolder3(v); } else if (viewType == ADS_ITEMTYPE) { View v = mInflater.inflate(R.layout.item_ad, parent, false); viewHolder = new ViewHolderAd(v); } return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ViewHolder1) { //头部 if (currWeatherData != null) { ... } } else if (holder instanceof ViewHolder2) { //天气预报信息 ((ViewHolder2) holder).setStyle(position); if (forecastsList.size() != 0) { ... } } else if (holder instanceof ViewHolder3) { //天气详细信息 if (currWeatherData != null) { ... } } } @Override public int getItemCount() { return 7; } @Override public int getItemViewType(int position) { if (position == 0) { return HEAD_ITEMTYPE; } else if (position == 5) { return FOOT_ITEMTYPE; } else if (position == 6) { return ADS_ITEMTYPE; } else { return BODY_ITEMTYPE; } } 7fe1 /** * 列表中的头部 */ public static class ViewHolder1 extends RecyclerView.ViewHolder { private ImageView weatherImg; private TextView temp, description, loc, date; public ViewHolder1(View itemView) { super(itemView); weatherImg = (ImageView) itemView.findViewById(R.id.weatherImg); temp = (TextView) itemView.findViewById(R.id.temp); description = (TextView) itemView.findViewById(R.id.description); loc = (TextView) itemView.findViewById(R.id.loc); date = (TextView) itemView.findViewById(R.id.date); } ... } /** * 列表中天气预报的item */ public static class ViewHolder2 extends RecyclerView.ViewHolder { private View root; private TextView data, weather, min_temp, max_temp; private ImageView weatherImg; public ViewHolder2(View itemView) { super(itemView); root = itemView.findViewById(R.id.root); data = (TextView) itemView.findViewById(R.id.item_date); weather = (TextView) itemView.findViewById(R.id.item_weather); weatherImg = (ImageView) itemView.findViewById(R.id.img); min_temp = (TextView) itemView.findViewById(R.id.item_mintemp); max_temp = (TextView) itemView.findViewById(R.id.item_maxtemp); } ... } /** * 列表的尾部 */ public static class ViewHolder3 extends RecyclerView.ViewHolder { private TextView pressure, humidity, sunrise, sunset, windspeed, winddeg; public ViewHolder3(View itemView) { super(itemView); pressure = (TextView) itemView.findViewById(R.id.pressure); humidity = (TextView) itemView.findViewById(R.id.humidity); sunrise = (TextView) itemView.findViewById(R.id.sunrise); sunset = (TextView) itemView.findViewById(R.id.sunset); windspeed = (TextView) itemView.findViewById(R.id.windspeed); winddeg = (TextView) itemView.findViewById(R.id.winddeg); } ... } /** * 最后的说明 */ public static class ViewHolderAd extends RecyclerView.ViewHolder { private AdView adView; public ViewHolderAd(View itemView) { super(itemView); // adView = (AdView) itemView.findViewById(R.id.adView); // AdRequest adRequest = new AdRequest.Builder().build(); // adView.loadAd(adRequest); } } ..... }
主要是根据getItemViewType来决定显示不同的item布局。
天气数据的处理
推荐使用一个android studio的插件,gsonformat,可以根据json直接生成java对象。
当前的天气信息来自Openweathermap
{ "coord": { "lon": 119.31, "lat": 26.06 }, "weather": [ { "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04n" } ], "base": "stations", "main": { "temp": 299.15, "pressure": 1010, ..气压 "humidity": 88, ..湿度 "temp_min": 299.15, ..温度 "temp_max": 299.15, ..温度 "sea_level":1019.43, "grnd_level":1001.39 }, "visibility": 10000, ..可见度 "wind": { "speed": 1 ..风速 }, "clouds": { "all": 75 ..云朵 }, "dt": 1466942400, "sys": { "type": 1, "id": 7441, "message": 0.0098, "country": "CN", "sunrise": 1466889171, "sunset": 1466938716 }, "id": 1810821, "name": "Fuzhou", "cod": 200 }
大致是这样,直接可以用gsonformat插件自动生成类。
天气预报里面的数据来自和风天气,数据由来自国内和国外,以下是国外的数据
{ "HeWeather data service 3.0": [ { "basic": { "city": "New York City", "cnty": "United States", "id": "US5128581", "lat": "40.714272", "lon": "-74.005966", "update": { "loc": "2015-07-14 23:44", "utc": "2015-07-15 03:46" } }, "status": "ok", "now": { "cond": { "code": "500", "txt": "Mist" }, "fl": "26", "hum": "89", "pcpn": "0.1", "pres": "1003", "tmp": "24", "vis": "10", "wind": { "deg": "120", "dir": "ESE", "sc": "1-2", "spd": "7" } }, "daily_forecast": [ { "date": "2015-07-14", "astro": { "sr": "05:37", "ss": "20:26" }, "cond": { "code_d": "103", "code_n": "305", "txt_d": "Partly Cloudy", "txt_n": "Light Rain" }, "hum": "59", "pcpn": "0.1", "pop": "43", "pres": "1002", "tmp": { "max": "31", "min": "22" }, "vis": "10", "wind": { "deg": "166", "dir": "SSE", "sc": "3-4", "spd": "7" } } ... ], "hourly_forecast": [ { "date": "2015-07-15 01:00", "hum": "83", "pop": "14", "pres": "1002", "tmp": "24", "wind": { "deg": "229", "dir": "SW", "sc": "3-4", "spd": "9" } } ... ] } ] }
里面的数据说明可以查看官网的说明。
每次网络请求的时候,将获取到的数据直接使用gson转化成对应的类。
其他内容如果需要,以后再补充。
项目下载地址
http://www.oschina.net/code/snippet_2000932_58476
项目比较简单,有疑问欢迎
相关文章推荐
- Android上实现一个简单的天气预报APP(九) ListView展示城市列表、单击更新天气数据
- Android上实现一个简单的天气预报APP(十二) 未来三天的天气预报
- Android APP启动向导 一个非常简单的ViewPager向导:
- Android一款简单的天气APP
- 自己写的一个简单的android记事本app
- Android上实现一个简单的天气预报APP(一) 设计
- 制作一个功能丰富的Android天气App
- Android调用Jni,非常简单的一个Demo
- Android上实现一个简单的天气预报APP(七) 切换到新的界面(选择城市界面)
- Android上实现一个简单的天气预报APP(二) 配置布局
- Android上实现一个简单的天气预报APP(十三) 导航ViewPager
- 一个简单天气app完成(总结)
- Android逆向实例笔记—记一个超简单但是没良心的锁机app
- 这是我做的一个比较简单的基于Android的APP的demo
- Android上实现一个简单的天气预报APP(五) 解析XML
- android WebView将新浪天气为我所用 ------>仅供娱乐(一个android webview 执行js的简单框架)
- Android 一个简单的计算器APP
- 打造支持apk下载和html5缓存的 IIS(配合一个超简单的android APP使用)详解
- (福利)分享一个用android编写的简单的APP——爱吖天气
- Android上实现一个简单的天气预报APP(十) 城市列表搜索框