您的位置:首页 > 移动开发

Android:一个非常非常简单的天气app

2016-08-05 00:00 836 查看
界面截图:





界面非常的简单。。。

数据来源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