Android 天气APP(十一)未来七天的天气预报、逐小时预报、UI优化

weatherStateIcon.setBackgroundResource(R.mipmap.icon_201);

break;

case 205://强风/劲风

case 206://疾风

case 207://大风

weatherStateIcon.setBackgroundResource(R.mipmap.icon_205);//因为这几个状态的图标是一样的

break;

case 208://烈风

case 209://风暴

case 210://狂爆风

case 211://飓风

case 212://龙卷风

case 213://热带风暴

weatherStateIcon.setBackgroundResource(R.mipmap.icon_208);//因为这几个状态的图标是一样的

break;

case 300://阵雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_300);

break;

case 301://强阵雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_301);

break;

case 302://雷阵雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_302);

break;

case 303://强雷阵雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_303);

break;

case 304://雷阵雨伴有冰雹

weatherStateIcon.setBackgroundResource(R.mipmap.icon_304);

break;

case 305://小雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_305);

break;

case 306://中雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_306);

break;

case 307://大雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_307);

break;

case 308://极端降雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_312);

break;

case 309://毛毛雨/细雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_309);

break;

case 310://暴雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_310);

break;

case 311://大暴雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_311);

break;

case 312://特大暴雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_312);

break;

case 313://冻雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_313);

break;

case 314://小到中雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_306);

break;

case 315://中到大雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_307);

break;

case 316://大到暴雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_310);

break;

case 317://大暴雨到特大暴雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_312);

break;

case 399://雨

weatherStateIcon.setBackgroundResource(R.mipmap.icon_399);

break;

case 400://小雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_400);

break;

case 401://中雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_401);

break;

case 402://大雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_402);

break;

case 403://暴雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_403);

break;

case 404://雨夹雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_404);

break;

case 405://雨雪天气

weatherStateIcon.setBackgroundResource(R.mipmap.icon_405);

break;

case 406://阵雨夹雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_406);

break;

case 407://阵雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_407);

break;

case 408://小到中雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_408);

break;

case 409://中到大雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_409);

break;

case 410://大到暴雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_410);

break;

case 499://雪

weatherStateIcon.setBackgroundResource(R.mipmap.icon_499);

break;

case 500://薄雾

weatherStateIcon.setBackgroundResource(R.mipmap.icon_500);

break;

case 501://雾

weatherStateIcon.setBackgroundResource(R.mipmap.icon_501);

break;

case 502://霾

weatherStateIcon.setBackgroundResource(R.mipmap.icon_502);

break;

case 503://扬沙

weatherStateIcon.setBackgroundResource(R.mipmap.icon_503);

break;

case 504://扬沙

weatherStateIcon.setBackgroundResource(R.mipmap.icon_504);

break;

case 507://沙尘暴

weatherStateIcon.setBackgroundResource(R.mipmap.icon_507);

break;

case 508://强沙尘暴

weatherStateIcon.setBackgroundResource(R.mipmap.icon_508);

break;

case 509://浓雾

case 510://强浓雾

case 514://大雾

case 515://特强浓雾

weatherStateIcon.setBackgroundResource(R.mipmap.icon_509);

break;

case 511://中度霾

weatherStateIcon.setBackgroundResource(R.mipmap.icon_511);

break;

case 512://重度霾

weatherStateIcon.setBackgroundResource(R.mipmap.icon_512);

break;

case 513://严重霾

weatherStateIcon.setBackgroundResource(R.mipmap.icon_513);

break;

case 900://热

weatherStateIcon.setBackgroundResource(R.mipmap.icon_900);

break;

case 901://冷

weatherStateIcon.setBackgroundResource(R.mipmap.icon_901);

break;

case 999://未知

weatherStateIcon.setBackgroundResource(R.mipmap.icon_999);

break;

}

}

}

WeatherForecastAdapter.java中做判断显示图标,代码如下:

package com.llw.goodweather.adapter;

import android.widget.ImageView;

import androidx.annotation.Nullable;

import com.chad.library.adapter.base.BaseQuickAdapter;

import com.chad.library.adapter.base.BaseViewHolder;

import com.llw.goodweather.R;

import com.llw.goodweather.bean.WeatherForecastResponse;

import com.llw.goodweather.utils.WeatherUtil;

import java.util.List;

/**

  • 天气预报列表展示适配器

*/

public class WeatherForecastAdapter extends BaseQuickAdapter<WeatherForecastResponse.HeWeather6Bean.DailyForecastBean, BaseViewHolder> {

public WeatherForecastAdapter(int layoutResId, @Nullable List<WeatherForecastResponse.HeWeather6Bean.DailyForecastBean> data) {

super(layoutResId, data);

}

@Override

protected void convert(BaseViewHolder helper, WeatherForecastResponse.HeWeather6Bean.DailyForecastBean item) {

helper.setText(R.id.tv_date, item.getDate())//日期

// .setText(R.id.tv_info, item.getCond_txt_d())//天气

.setText(R.id.tv_low_and_height, item.getTmp_min() + “/” + item.getTmp_max() + “℃”);//最低温和最高温

//天气状态图片

ImageView weatherStateIcon = helper.getView(R.id.iv_weather_state);

int code = Integer.parseInt(item.getCond_code_d());//获取天气状态码,根据状态码来显示图标

WeatherUtil.changeIcon(weatherStateIcon,code);//调用工具类中写好的方法

}

}

在这里插入图片描述

因为写作过程中,还有其他事情,所以并不是一蹴而就的,当我写适配器代码的时候就我的邮箱就已经收到通过审核的短信了,你如果没有收到也不要着急,只要资料没有问题,审核还是蛮快的,关键看审核的人员那个时候有没有帮你审核。现在我成为一个认证开发者了,那么可以直接运行一下。

在这里插入图片描述

再切换一个城市

在这里插入图片描述

从这个运行的效果图来看,完成了两件事,第一个就是未来七天的天气预报,这个只要你通过了审核,成为开发者,返回的数据自然就变成7天的,第二个就是UI优化,感觉图标显示还是比文字显示更好一些,这个就属于细节优化问题了,因为这个细节,你还是要做很多准备工作的。

逐小时预报和UI优化


https://free-api.heweather.net/s6/weather/hourly?location=%E7%A6%8F%E7%94%B0&key=3086e91d66c04ce588a7f538f917c7f4

在这里插入图片描述

访问测试地址,请以自己的Key去访问,返回的结果

在这里插入图片描述

在bean包下创建一个HourlyResponse.java,里面的代码如下:

package com.llw.goodweather.bean;

import java.util.List;

public class HourlyResponse {

private List HeWeather6;

public List getHeWeather6() {

return HeWeather6;

}

public void setHeWeather6(List HeWeather6) {

this.HeWeather6 = HeWeather6;

}

public static class HeWeather6Bean {

/**

  • basic : {“cid”:“CN101280603”,“location”:“福田”,“parent_city”:“深圳”,“admin_area”:“广东”,“cnty”:“中国”,“lat”:“22.5410099”,“lon”:“114.05095673”,“tz”:“+8.00”}

  • update : {“loc”:“2020-04-28 19:56”,“utc”:“2020-04-28 11:56”}

  • status : ok

  • hourly : [{“cloud”:“43”,“cond_code”:“101”,“cond_txt”:“多云”,“dew”:“19”,“hum”:“71”,“pop”:“0”,“pres”:“1010”,“time”:“2020-04-28 22:00”,“tmp”:“23”,“wind_deg”:“82”,“wind_dir”:“东风”,“wind_sc”:“1-2”,“wind_spd”:“2”},{“cloud”:“35”,“cond_code”:“100”,“cond_txt”:“晴”,“dew”:“18”,“hum”:“74”,“pop”:“0”,“pres”:“1011”,“time”:“2020-04-29 01:00”,“tmp”:“22”,“wind_deg”:“14”,“wind_dir”:“东北风”,“wind_sc”:“1-2”,“wind_spd”:“11”},{“cloud”:“69”,“cond_code”:“100”,“cond_txt”:“晴”,“dew”:“18”,“hum”:“72”,“pop”:“0”,“pres”:“1011”,“time”:“2020-04-29 04:00”,“tmp”:“21”,“wind_deg”:“43”,“wind_dir”:“东北风”,“wind_sc”:“1-2”,“wind_spd”:“4”},{“cloud”:“90”,“cond_code”:“101”,“cond_txt”:“多云”,“dew”:“19”,“hum”:“62”,“pop”:“0”,“pres”:“1008”,“time”:“2020-04-29 07:00”,“tmp”:“21”,“wind_deg”:“53”,“wind_dir”:“东北风”,“wind_sc”:“1-2”,“wind_spd”:“9”},{“cloud”:“91”,“cond_code”:“101”,“cond_txt”:“多云”,“dew”:“19”,“hum”:“58”,“pop”:“0”,“pres”:“1008”,“time”:“2020-04-29 10:00”,“tmp”:“27”,“wind_deg”:“45”,“wind_dir”:“东北风”,“wind_sc”:“1-2”,“wind_spd”:“10”},{“cloud”:“75”,“cond_code”:“101”,“cond_txt”:“多云”,“dew”:“18”,“hum”:“59”,“pop”:“0”,“pres”:“1009”,“time”:“2020-04-29 13:00”,“tmp”:“29”,“wind_deg”:“32”,“wind_dir”:“东北风”,“wind_sc”:“1-2”,“wind_spd”:“4”},{“cloud”:“59”,“cond_code”:“100”,“cond_txt”:“晴”,“dew”:“18”,“hum”:“60”,“pop”:“0”,“pres”:“1009”,“time”:“2020-04-29 16:00”,“tmp”:“27”,“wind_deg”:“50”,“wind_dir”:“东北风”,“wind_sc”:“1-2”,“wind_spd”:“6”},{“cloud”:“37”,“cond_code”:“101”,“cond_txt”:“多云”,“dew”:“19”,“hum”:“61”,“pop”:“0”,“pres”:“1008”,“time”:“2020-04-29 19:00”,“tmp”:“26”,“wind_deg”:“-1”,“wind_dir”:“无持续风向”,“wind_sc”:“1-2”,“wind_spd”:“2”}]

*/

private BasicBean basic;

private UpdateBean update;

private String status;

private List hourly;

public BasicBean getBasic() {

return basic;

}

public void setBasic(BasicBean basic) {

this.basic = basic;

}

public UpdateBean getUpdate() {

return update;

}

public void setUpdate(UpdateBean update) {

this.update = update;

}

public String getStatus() {

return status;

}

public void setStatus(String status) {

this.status = status;

}

public List getHourly() {

return hourly;

}

public void setHourly(List hourly) {

this.hourly = hourly;

}

public static class BasicBean {

/**

  • cid : CN101280603

  • location : 福田

  • parent_city : 深圳

  • admin_area : 广东

  • cnty : 中国

  • lat : 22.5410099

  • lon : 114.05095673

  • tz : +8.00

*/

private String cid;

private String location;

private String parent_city;

private String admin_area;

private String cnty;

private String lat;

private String lon;

private String tz;

public String getCid() {

return cid;

}

public void setCid(String cid) {

this.cid = cid;

}

public String getLocation() {

return location;

}

public void setLocation(String location) {

this.location = location;

}

public String getParent_city() {

return parent_city;

}

public void setParent_city(String parent_city) {

this.parent_city = parent_city;

}

public String getAdmin_area() {

return admin_area;

}

public void setAdmin_area(String admin_area) {

this.admin_area = admin_area;

}

public String getCnty() {

return cnty;

}

public void setCnty(String cnty) {

this.cnty = cnty;

}

public String getLat() {

return lat;

}

public void setLat(String lat) {

this.lat = lat;

}

public String getLon() {

return lon;

}

public void setLon(String lon) {

this.lon = lon;

}

public String getTz() {

return tz;

}

public void setTz(String tz) {

this.tz = tz;

}

}

public static class UpdateBean {

/**

  • loc : 2020-04-28 19:56

  • utc : 2020-04-28 11:56

*/

private String loc;

private String utc;

public String getLoc() {

return loc;

}

public void setLoc(String loc) {

this.loc = loc;

}

public String getUtc() {

return utc;

}

public void setUtc(String utc) {

this.utc = utc;

}

}

public static class HourlyBean {

/**

  • cloud : 43

  • cond_code : 101

  • cond_txt : 多云

  • dew : 19

  • hum : 71

  • pop : 0

  • pres : 1010

  • time : 2020-04-28 22:00

  • tmp : 23

  • wind_deg : 82

  • wind_dir : 东风

  • wind_sc : 1-2

  • wind_spd : 2

*/

private String cloud;

private String cond_code;

private String cond_txt;

private String dew;

private String hum;

private String pop;

private String pres;

private String time;

private String tmp;

private String wind_deg;

private String wind_dir;

private String wind_sc;

private String wind_spd;

public String getCloud() {

return cloud;

}

public void setCloud(String cloud) {

this.cloud = cloud;

}

public String getCond_code() {

return cond_code;

}

public void setCond_code(String cond_code) {

this.cond_code = cond_code;

}

public String getCond_txt() {

return cond_txt;

}

public void setCond_txt(String cond_txt) {

this.cond_txt = cond_txt;

}

public String getDew() {

return dew;

}

public void setDew(String dew) {

this.dew = dew;

}

public String getHum() {

return hum;

}

public void setHum(String hum) {

this.hum = hum;

}

public String getPop() {

return pop;

}

public void setPop(String pop) {

this.pop = pop;

}

public String getPres() {

return pres;

}

public void setPres(String pres) {

this.pres = pres;

}

public String getTime() {

return time;

}

public void setTime(String time) {

this.time = time;

}

public String getTmp() {

return tmp;

}

public void setTmp(String tmp) {

this.tmp = tmp;

}

public String getWind_deg() {

return wind_deg;

}

public void setWind_deg(String wind_deg) {

this.wind_deg = wind_deg;

}

public String getWind_dir() {

return wind_dir;

}

public void setWind_dir(String wind_dir) {

this.wind_dir = wind_dir;

}

public String getWind_sc() {

return wind_sc;

}

public void setWind_sc(String wind_sc) {

this.wind_sc = wind_sc;

}

public String getWind_spd() {

return wind_spd;

}

public void setWind_spd(String wind_spd) {

this.wind_spd = wind_spd;

}

}

}

}

页面渲染的数据从这些返回实体里面取,下一步,创建接口,打开ApiService.java

在里面增加

在这里插入图片描述

注意Key用自己的,然后创建订阅,打开WeatherContract.java

在这里插入图片描述

在这里插入图片描述

订阅方法

/**

  • 逐小时预报

  • @param context

  • @param location

*/

public void hourly(final Context context,String location){

ApiService service = ServiceGenerator.createService(ApiService.class,0);

service.getHourly(location).enqueue(new NetCallBack() {

@Override

public void onSuccess(Call call, Response response) {

if(getView() != null){

getView().getHourlyResult(response);

}

}

@Override

public void onFailed() {

if(getView() != null){

getView().getDataFailed();

}

}

});

}

接口返回值

//查询逐小时天气的数据返回

void getHourlyResult(Response response);

接下来就是MainActivity.java

在这里插入图片描述

代码如下:

//逐小时天气预报返回

@Override

public void getHourlyResult(Response response) {

dismissLoadingDialog();//关闭弹窗

if ((“ok”).equals(response.body().getHeWeather6().get(0).getStatus())) {

} else {

ToastUtils.showShortToast(context, response.body().getHeWeather6().get(0).getStatus());

}

}

需要在三个地方进行请求,拿到定位之后、下拉的时候、切换城市之后

在这里插入图片描述

在这里插入图片描述

通过断点查看到了返回的数据,这一步你可以跳过,不会有什么影响,往下走

在这里插入图片描述

现在数据已经拿到了,接下来就是数据的渲染了,依然使用列表来做显示,这里我们用横向的列表,摆放的位置就放在7天天气预报的上方,这样会比较合理。

接下来在layout下创建一个item_weather_hourly_list.xml文件,

在这里插入图片描述

这就是每一个item的显示效果,只不过背景是无色的,这里之所以放黑色背景,是在写布局的时候易于调整。

item_weather_hourly_list.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:orientation=“vertical”

android:gravity=“center_horizontal”

android:padding=“8dp”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”>

<TextView

android:id=“@+id/tv_time”

android:textColor=“#FFF”

android:text=“上午10:00”

android:textSize=“14sp”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

<ImageView

android:layout_marginTop=“12dp”

android:layout_marginBottom=“8dp”

android:id=“@+id/iv_weather_state”

android:background=“@mipmap/icon_100”

android:layout_width=“30dp”

android:layout_height=“30dp”/>

<TextView

android:textSize=“20sp”

android:id=“@+id/tv_temperature”

android:textColor=“#FFF”

android:text=“25℃”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

然后在WeatherUtil.java中再增加一个方法showTimeInfo

/**

  • 根据传入的时间显示时间段描述信息

  • @param timeData

  • @return

*/

public static String showTimeInfo(String timeData){

String timeInfo = null;

int time = 0;

time = Integer.parseInt(timeData.trim().substring(0,2));

if (time >= 0 && time <= 6) {

timeInfo = “凌晨”;

}else if (time > 6 && time <= 12) {

timeInfo = “上午”;

}else if (time > 12 && time <= 13) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

ime > 6 && time <= 12) {

timeInfo = “上午”;

}else if (time > 12 && time <= 13) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-0zeb8CNC-1712518484803)]

[外链图片转存中…(img-bSecCUO1-1712518484804)]

[外链图片转存中…(img-OtBnjyLw-1712518484805)]

[外链图片转存中…(img-fhqRVj6S-1712518484805)]

[外链图片转存中…(img-yKLi7A96-1712518484805)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

[外链图片转存中…(img-6A7bCoTD-1712518484806)]

[外链图片转存中…(img-SSrCPdEX-1712518484806)]

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值