}
public void setTmp_min(String tmp_min) {
this.tmp_min = tmp_min;
}
public String getUv_index() {
return uv_index;
}
public void setUv_index(String uv_index) {
this.uv_index = uv_index;
}
public String getVis() {
return vis;
}
public void setVis(String vis) {
this.vis = vis;
}
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;
}
}
public static class HourlyBean {
/**
-
cloud : 11
-
cond_code : 101
-
cond_txt : 多云
-
dew : 22
-
hum : 73
-
pop : 7
-
pres : 998
-
time : 2020-05-16 13:00
-
tmp : 33
-
wind_deg : 174
-
wind_dir : 南风
-
wind_sc : 1-2
-
wind_spd : 5
*/
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;
}
}
public static class LifestyleBean {
/**
-
type : comf
-
brf : 较不舒适
-
txt : 白天天气多云,并且空气湿度偏大,在这种天气条件下,您会感到有些闷热,不很舒适。
*/
private String type;
private String brf;
private String txt;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getBrf() {
return brf;
}
public void setBrf(String brf) {
this.brf = brf;
}
public String getTxt() {
return txt;
}
public void setTxt(String txt) {
this.txt = txt;
}
}
}
}
在ApiService中增加
/**
-
获取所有天气数据,在返回值中再做处理
-
@param location
-
@return
*/
@GET(“/s6/weather?key=3086e91d66c04ce588a7f538f917c7f4”)
Call weatherData(@Query(“location”) String location);
在WeatherContract中增加订阅
/**
-
天气所有数据
-
@param context
-
@param location
*/
public void weatherData(final Context context,String location){
ApiService service = ServiceGenerator.createService(ApiService.class,0);
service.weatherData(location).enqueue(new NetCallBack() {
@Override
public void onSuccess(Call call, Response response) {
if(getView() != null){
getView().getWeatherDataResult(response);
}
}
@Override
public void onFailed() {
if(getView() != null){
getView().getWeatherDataFailed();
}
}
});
}
//查询天气所有数据
void getWeatherDataResult(Response response);
//天气数据获取错误返回
void getWeatherDataFailed();
进入MainActivity.java中
/**
-
所有天气数据返回
-
@param response
*/
@Override
public void getWeatherDataResult(Response response) {
dismissLoadingDialog();//关闭弹窗
if ((“ok”).equals(response.body().getHeWeather6().get(0).getStatus())) {
}else {
ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getHeWeather6().get(0).getStatus()));
}
}
首先改动适配器
七天天气预报适配器WeatherForecastAdapter.java
逐小时天气预报适配器WeatherHourlyAdapter.java
然后回到MainActivity.java
红框中为新增的,然后之前的注释掉,当所有的改动都完成之后,再删除掉注释的没有用的代码、
红框中的就是你要改动的
然后修改切换城市之后的方法请求
定位后
下拉刷新之后
onResume方法中
返回值里面的业务逻辑处理代码先注释掉,最后修改getWeatherDataResult。
修改代码如下:
/**
-
所有天气数据返回
-
@param response
*/
@Override
public void getWeatherDataResult(Response response) {
refresh.finishRefresh();//关闭刷新
dismissLoadingDialog();//关闭弹窗
if (mLocationClient != null) {
mLocationClient.stop();//数据返回后关闭定位
}
if ((“ok”).equals(response.body().getHeWeather6().get(0).getStatus())) {
if (response.body().getHeWeather6().get(0).getBasic() != null) {//得到数据不为空则进行数据显示
/**
- 当天天气
*/
tvTemperature.setText(response.body().getHeWeather6().get(0).getNow().getTmp());//温度
if (flag) {
ivLocation.setVisibility(View.VISIBLE);//显示定位图标
} else {
ivLocation.setVisibility(View.GONE);//显示定位图标
}
tvCity.setText(response.body().getHeWeather6().get(0).getBasic().getLocation());//城市
tvInfo.setText(response.body().getHeWeather6().get(0).getNow().getCond_txt());//天气状况
//修改上次更新时间的结果显示 -> 更加人性化
String datetime = response.body().getHeWeather6().get(0).getUpdate().getLoc();//赋值
String time = datetime.substring(11);//截去前面的字符,保留后面所有的字符,就剩下 22:00
tvOldTime.setText(“上次更新时间:” + WeatherUtil.showTimeInfo(time) + time);
tvWindDirection.setText("风向 " + response.body().getHeWeather6().get(0).getNow().getWind_dir());//风向
tvWindPower.setText("风力 " + response.body().getHeWeather6().get(0).getNow().getWind_sc() + “级”);//风力
wwBig.startRotate();//大风车开始转动
wwSmall.startRotate();//小风车开始转动
/**
- 查询7天天气预报
*/
//最低温和最高温
tvLowHeight.setText(response.body().getHeWeather6().get(0).getDaily_forecast().get(0).getTmp_min() + " / " +
response.body().getHeWeather6().get(0).getDaily_forecast().get(0).getTmp_max() + “℃”);
if (response.body().getHeWeather6().get(0).getDaily_forecast() != null) {
List<WeatherResponse.HeWeather6Bean.DailyForecastBean> data
= response.body().getHeWeather6().get(0).getDaily_forecast();
mListDailyForecast.clear();//添加数据之前先清除
mListDailyForecast.addAll(data);//添加数据
mAdapter.notifyDataSetChanged();//刷新列表
} else {
ToastUtils.showShortToast(context, “天气预报数据为空”);
}
/**
- 查询逐小时天气数据
*/
if (response.body().getHeWeather6().get(0).getHourly() != null) {
List<WeatherResponse.HeWeather6Bean.HourlyBean> data
= response.body().getHeWeather6().get(0).getHourly();
mListHourlyBean.clear();//添加数据之前先清除
mListHourlyBean.addAll(data);//添加数据
mAdapterHourly.notifyDataSetChanged();//刷新列表
} else {
ToastUtils.showShortToast(context, “逐小时预报数据为空”);
}
/**
- 生活指数
*/
List<WeatherResponse.HeWeather6Bean.LifestyleBean> data = response.body().getHeWeather6().get(0).getLifestyle();
if (!ObjectUtils.isEmpty(data)) {
for (int i = 0; i < data.size(); i++) {
switch (data.get(i).getType()){
case “uv”:
tvUv.setText(“紫外线:” + data.get(i).getTxt());
break;
case “comf”:
tvComf.setText(“舒适度:” + data.get(i).getTxt());
break;
case “drsg”:
tvDrsg.setText(“穿衣指数:” + data.get(i).getTxt());
break;
case “flu”:
tvFlu.setText(“感冒指数:” + data.get(i).getTxt());
break;
case “sport”:
tvSport.setText(“运动指数:” + data.get(i).getTxt());
break;
case “trav”:
tvTrav.setText(“旅游指数:” + data.get(i).getTxt());
break;
case “cw”:
tvCw.setText(“洗车指数:” + data.get(i).getTxt());
break;
case “air”:
tvAir.setText(“空气指数:” + data.get(i).getTxt());
break;
}
}
} else {
ToastUtils.showShortToast(context, “生活指数数据为空”);
}
}else {
ToastUtils.showShortToast(context,“天气数据为空”);
}
}else {
ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getHeWeather6().get(0).getStatus()));
}
改到这里就是初步改完了,运行一下:
很明显,和之前什么变化都没有,但是,里面的业务处理方式发生了改变,之前是一次性请求四次接口,现在是变成一个接口了,无疑在机制上有了优化,现在就可以注释掉其他的代码了。
打开ApiService
这里将之前的四个API注释掉。
再打开订阅器
然后再回到MainActivity
将这四个报错的返回方法注释掉,这是你的页面是不会有报错的,然后再运行一下,确保没有问题。好了,已经运行过没有问题了,那么最后就是删除掉注释的代码了。
这四个实体bean也可以删除了,删除之后再运行一下,OK,没有问题。也算是为应用做了一次瘦身了,下面就是优化一下用户的体验。
优化UI
增加逐小时天气预报详情和七天天气预报详情,
这个我打算用弹窗来做,首先是逐小时天气预报的详情,创建一个弹窗的背景样式
在项目的drawable下创建shape_white_5.xml文件
样式代码如下:
<?xml version="1.0" encoding="utf-8"?>① 逐小时天气预报的详情UI
在项目的layout文件下创建window_hourly_detail.xml文件
布局代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:orientation=“vertical”
android:background=“@drawable/shape_white_5”
android:padding=“@dimen/dp_12”
android:layout_width=“300dp”
android:layout_height=“400dp”>
<TextView
android:gravity=“center_vertical”
android:textColor=“@color/black”
android:textSize=“@dimen/sp_16”
android:textStyle=“bold”
android:id=“@+id/tv_time”
android:layout_width=“match_parent”
android:layout_height=“@dimen/dp_40”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“温度”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_tem”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“天气状况”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_cond_txt”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“风向360角度”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_wind_deg”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“风向”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_wind_dir”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“风力”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_wind_sc”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“风速”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_wind_spd”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“相对湿度”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_hum”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“大气压强”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_pres”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“降水概率”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_pop”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“露点温度”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_dew”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“云量”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_cloud”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
由于这一次的弹窗是屏幕中间出现,所以增加动画效果和代码,在mvplibrary模块下的anim文件夹中增加出现和隐藏的动画xml文件
window_hidden_anim.xml
<?xml version="1.0" encoding="utf-8"?><scale
android:duration=“300”
android:fromXScale=“1.0”
android:fromYScale=“1.0”
android:pivotX=“50%”
android:pivotY=“50%”
android:toXScale=“0.5”
android:toYScale=“0.5” />
<alpha
android:duration=“300”
android:fromAlpha=“1.0”
android:interpolator=“@android:anim/accelerate_interpolator”
android:toAlpha=“0.0” />
window_show_anim.xml
<?xml version="1.0" encoding="utf-8"?><scale
android:duration=“300”
android:fromXScale=“0.6”
android:fromYScale=“0.6”
android:pivotX=“50%”
android:pivotY=“50%”
android:toXScale=“1.0”
android:toYScale=“1.0” />
<alpha
android:duration=“300”
android:fromAlpha=“0.0”
android:interpolator=“@android:anim/decelerate_interpolator”
android:toAlpha=“1.0” />
然后在styles.xml文件中添加
这里还会用到一个测量的工具类SizeUtils.java
代码如下:
package com.llw.mvplibrary.utils;
import android.content.Context;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
/**
- dp sp px 转换 view 测量工个类
*/
public final class SizeUtils {
private SizeUtils() {
throw new UnsupportedOperationException(“u can’t instantiate me…”);
}
/**
-
Value of dp to value of px.
-
@param dpValue The value of dp.
-
@return value of px
*/
public static int dp2px(Context context, final float dpValue) {
final float scale = context.getApplicationContext().getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
-
Value of px to value of dp.
-
@param pxValue The value of px.
-
@return value of dp
*/
public static int px2dp(Context context, final float pxValue) {
final float scale = context.getApplicationContext().getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
-
Value of sp to value of px.
-
@param spValue The value of sp.
-
@return value of px
*/
public static int sp2px(Context context, final float spValue) {
final float fontScale = context.getApplicationContext().getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
/**
-
Value of px to value of sp.
-
@param pxValue The value of px.
-
@return value of sp
*/
public static int px2sp(Context context, final float pxValue) {
final float fontScale = context.getApplicationContext().getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
-
Converts an unpacked complex data value holding a dimension to its final floating
-
point value. The two parameters unit and value
-
are as in {@link TypedValue#TYPE_DIMENSION}.
-
@param value The value to apply the unit to.
-
@param unit The unit to convert from.
-
@return The complex floating point value multiplied by the appropriate
-
metrics depending on its unit.
*/
public static float applyDimension(Context context, final float value, final int unit) {
DisplayMetrics metrics = context.getApplicationContext().getResources().getDisplayMetrics();
switch (unit) {
case TypedValue.COMPLEX_UNIT_PX:
return value;
case TypedValue.COMPLEX_UNIT_DIP:
return value * metrics.density;
case TypedValue.COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case TypedValue.COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f / 72);
case TypedValue.COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case TypedValue.COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f / 25.4f);
}
return 0;
}
/**
-
Force get the size of view.
-
e.g.
-
SizeUtils.forceGetViewSize(view, new SizeUtils.onGetSizeListener() {
-
Override
-
public void onGetSize(final View view) {
-
view.getWidth();
-
}
-
});
-
@param view The view.
-
@param listener The get size listener.
*/
public static void forceGetViewSize(final View view, final onGetSizeListener listener) {
view.post(new Runnable() {
@Override
public void run() {
if (listener != null) {
listener.onGetSize(view);
}
}
});
}
/**
-
Return the width of view.
-
@param view The view.
-
@return the width of view
*/
public static int getMeasuredWidth(final View view) {
return measureView(view)[0];
}
/**
-
Return the height of view.
-
@param view The view.
-
@return the height of view
*/
public static int getMeasuredHeight(final View view) {
return measureView(view)[1];
}
/**
-
Measure the view.
-
@param view The view.
-
@return arr[0]: view’s width, arr[1]: view’s height
*/
public static int[] measureView(final View view) {
ViewGroup.LayoutParams lp = view.getLayoutParams();
if (lp == null) {
lp = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
}
int widthSpec = ViewGroup.getChildMeasureSpec(0, 0, lp.width);
int lpHeight = lp.height;
int heightSpec;
if (lpHeight > 0) {
heightSpec = View.MeasureSpec.makeMeasureSpec(lpHeight, View.MeasureSpec.EXACTLY);
} else {
heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
}
view.measure(widthSpec, heightSpec);
return new int[]{view.getMeasuredWidth(), view.getMeasuredHeight()};
}
///
// interface
///
public interface onGetSizeListener {
void onGetSize(View view);
}
}
现在去LiWindow.java中增加中间显示的代码.
增加的代码我也贴一下:
/**
-
中间显示
-
@param mView
*/
public void showCenterPopupWindow(View mView,int width,int height) {
mPopupWindow = new PopupWindow(mView,
width, height, true);
mPopupWindow.setContentView(mView);
mPopupWindow.setAnimationStyle(R.style.AnimationCenterFade); //设置动画
mPopupWindow.showAtLocation(mView, Gravity.CENTER, 0, 0);
mPopupWindow.update();
setBackgroundAlpha(0.5f,mContext);
WindowManager.LayoutParams nomal = ((Activity) mContext).getWindow().getAttributes();
nomal.alpha = 0.5f;
((Activity) mContext).getWindow().setAttributes(nomal);
mPopupWindow.setOnDismissListener(closeDismiss);
}
现在修改item_weather_hourly_list.xml,增加了一个id和点击的水波纹效果,代码如下,复制粘贴即可:
<?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:id=“@+id/item_hourly”
android:foreground=“@drawable/bg_white”
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”/>
再修改WeatherHourlyAdapter.java适配器
添加点击事件的id。
进入MainActivity.java
这个代码就手写一下吧,也不多,然后是这个弹窗的方法
//显示逐三小时详情天气信息弹窗
private void showHourlyWindow(WeatherResponse.HeWeather6Bean.HourlyBean data) {
liWindow = new LiWindow(context);
final View view = LayoutInflater.from(context).inflate(R.layout.window_hourly_detail, null);
TextView tv_time = view.findViewById(R.id.tv_time);//时间
TextView tv_tem = view.findViewById(R.id.tv_tem);//温度
TextView tv_cond_txt = view.findViewById(R.id.tv_cond_txt);//天气状态描述
TextView tv_wind_deg = view.findViewById(R.id.tv_wind_deg);//风向360角度
TextView tv_wind_dir = view.findViewById(R.id.tv_wind_dir);//风向
TextView tv_wind_sc = view.findViewById(R.id.tv_wind_sc);//风力
TextView tv_wind_spd = view.findViewById(R.id.tv_wind_spd);//风速
TextView tv_hum = view.findViewById(R.id.tv_hum);//相对湿度
TextView tv_pres = view.findViewById(R.id.tv_pres);//大气压强
TextView tv_pop = view.findViewById(R.id.tv_pop);//降水概率
TextView tv_dew = view.findViewById(R.id.tv_dew);//露点温度
TextView tv_cloud = view.findViewById(R.id.tv_cloud);//云量
String datetime = data.getTime();//赋值
String time = datetime.substring(11);//截去前面的字符,保留后面所有的字符,就剩下 22:00
tv_time.setText(WeatherUtil.showTimeInfo(time) + time);
tv_tem.setText(data.getTmp() + “℃”);
tv_cond_txt.setText(data.getCond_txt());
tv_wind_deg.setText(data.getWind_deg()+“°”);
tv_wind_dir.setText(data.getWind_dir());
tv_wind_sc.setText(data.getWind_sc()+“级”);
tv_wind_spd.setText(data.getWind_spd() + “公里/小时”);
tv_hum.setText(data.getHum());
tv_pres.setText(data.getPres());
tv_pop.setText(data.getPop() + “%”);
tv_dew.setText(data.getDew()+“℃”);
tv_cloud.setText(data.getCloud());
liWindow.showCenterPopupWindow(view, SizeUtils.dp2px(context, 300),SizeUtils.dp2px(context, 400));
}
OK,到目前为止,可以运行一下了
OK,还是蛮简单的吧(PS:由于没有UI,大家这个都知道开发的审美,就先将就一下,如果有好的建议可以给我提)。
② 未来七天天气的详情UI
其实这个和逐小时的比较类似,不过要比逐小时的数据要多一些,
在项目的layout文件下创建window_forecast_detail.xml文件
布局代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:orientation=“vertical”
android:background=“@drawable/shape_white_5”
android:padding=“@dimen/dp_12”
android:layout_width=“300dp”
android:layout_height=“500dp”>
<TextView
android:gravity=“center_vertical”
android:textColor=“@color/black”
android:textSize=“@dimen/sp_16”
android:textStyle=“bold”
android:id=“@+id/tv_datetime”
android:layout_width=“match_parent”
android:layout_height=“@dimen/dp_40”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“最高温”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_tmp_max”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“最低温”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_tmp_min”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“紫外线强度”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_uv_index”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“白天天气状况”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_cond_txt_d”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“晚上天气状况”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_cond_txt_n”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“风向360角度”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_wind_deg”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“风向”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_wind_dir”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“风力”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_wind_sc”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“风速”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_wind_spd”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“相对湿度”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_hum”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“大气压强”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_pres”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“降水量”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_pcpn”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“降水概率”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_pop”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<LinearLayout
android:gravity=“center_vertical”
android:layout_width=“match_parent”
android:layout_height=“0dp”
android:layout_weight=“1”>
<TextView
android:text=“能见度”
android:textColor=“@color/black”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
<TextView
android:textColor=“@color/black”
android:id=“@+id/tv_vis”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”/>
修改item_weather_forecast_list.xml增加ID和点击效果
修改WeatherForecastAdapter.java,绑定点击事件的id
这里先添加一个事件日期的工具类进去,是我好久之前写的,不过也能用的上DateUtils.java,代码如下:
package com.llw.goodweather.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
public class DateUtils {
//获取当前完整的日期和时间
public static String getNowDateTime() {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
return sdf.format(new Date());
}
//获取当前日期
public static String getNowDate() {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”);
return sdf.format(new Date());
}
//前一天
public static String getYesterday(Date date) {
String tomorrow = “”;
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.add(calendar.DATE, -1);
date = calendar.getTime();
SimpleDateFormat formatter = new SimpleDateFormat(“yyyy-MM-dd”);
tomorrow = formatter.format(date);
return tomorrow;
}
//后一天
public static String getTomorrow(Date date) {
String tomorrow = “”;
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.add(calendar.DATE, +1);
date = calendar.getTime();
SimpleDateFormat formatter = new SimpleDateFormat(“yyyy-MM-dd”);
tomorrow = formatter.format(date);
return tomorrow;
}
//获取当前时间
public static String getNowTime() {
SimpleDateFormat sdf = new SimpleDateFormat(“HH:mm:ss”);
return sdf.format(new Date());
}
//获取当前日期(精确到毫秒)
public static String getNowTimeDetail() {
SimpleDateFormat sdf = new SimpleDateFormat(“HH:mm:ss.SSS”);
return sdf.format(new Date());
}
//获取今天是星期几
public static String getWeekOfDate(Date date) {
String[] weekDays = {“星期日”, “星期一”, “星期二”, “星期三”, “星期四”, “星期五”, “星期六”};
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}
//计算星期几
private static int getDayOfWeek(String dateTime) {
Calendar cal = Calendar.getInstance();
if (dateTime.equals(“”)) {
cal.setTime(new Date(System.currentTimeMillis()));
} else {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”, Locale.getDefault());
Date date;
try {
date = sdf.parse(dateTime);
} catch (ParseException e) {
date = null;
e.printStackTrace();
}
if (date != null) {
cal.setTime(new Date(date.getTime()));
}
}
return cal.get(Calendar.DAY_OF_WEEK);
}
//根据年月日计算是星期几并与当前日期判断 非昨天、今天、明天 则以星期显示
public static String Week(String dateTime) {
String week = “”;
String yesterday = “”;
String today = “”;
String tomorrow = “”;
yesterday = getYesterday(new Date());
today = getNowDate();
tomorrow = getTomorrow(new Date());
if (dateTime.equals(yesterday)) {
week = “昨天”;
} else if (dateTime.equals(today)) {
week = “今天”;
} else if (dateTime.equals(tomorrow)) {
week = “明天”;
} else {
switch (getDayOfWeek(dateTime)) {
case 1:
week = “星期日”;
break;
case 2:
week = “星期一”;
break;
case 3:
week = “星期二”;
break;
case 4:
week = “星期三”;
break;
case 5:
week = “星期四”;
break;
case 6:
week = “星期五”;
break;
case 7:
week = “星期六”;
break;
}
}
return week;
}
//将时间戳转化为对应的时间(10位或者13位都可以)
public static String formatTime(long time) {
String times = null;
if (String.valueOf(time).length() > 10) {// 10位的秒级别的时间戳
times = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(new Date(time * 1000));
} else {// 13位的秒级别的时间戳
times = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(time);
}
return times;
}
//将时间字符串转为时间戳字符串
public static String getStringTimestamp(String time) {
String timestamp = null;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
这里我希望可以帮助到大家提升进阶。
内容包含:Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。
喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~
文章来源:https://www.toymoban.com/news/detail-857815.html
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-857815.html
- 1;
if (w < 0)
w = 0;
return weekDays[w];
}
//计算星期几
private static int getDayOfWeek(String dateTime) {
Calendar cal = Calendar.getInstance();
if (dateTime.equals(“”)) {
cal.setTime(new Date(System.currentTimeMillis()));
} else {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd”, Locale.getDefault());
Date date;
try {
date = sdf.parse(dateTime);
} catch (ParseException e) {
date = null;
e.printStackTrace();
}
if (date != null) {
cal.setTime(new Date(date.getTime()));
}
}
return cal.get(Calendar.DAY_OF_WEEK);
}
//根据年月日计算是星期几并与当前日期判断 非昨天、今天、明天 则以星期显示
public static String Week(String dateTime) {
String week = “”;
String yesterday = “”;
String today = “”;
String tomorrow = “”;
yesterday = getYesterday(new Date());
today = getNowDate();
tomorrow = getTomorrow(new Date());
if (dateTime.equals(yesterday)) {
week = “昨天”;
} else if (dateTime.equals(today)) {
week = “今天”;
} else if (dateTime.equals(tomorrow)) {
week = “明天”;
} else {
switch (getDayOfWeek(dateTime)) {
case 1:
week = “星期日”;
break;
case 2:
week = “星期一”;
break;
case 3:
week = “星期二”;
break;
case 4:
week = “星期三”;
break;
case 5:
week = “星期四”;
break;
case 6:
week = “星期五”;
break;
case 7:
week = “星期六”;
break;
}
}
return week;
}
//将时间戳转化为对应的时间(10位或者13位都可以)
public static String formatTime(long time) {
String times = null;
if (String.valueOf(time).length() > 10) {// 10位的秒级别的时间戳
times = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(new Date(time * 1000));
} else {// 13位的秒级别的时间戳
times = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(time);
}
return times;
}
//将时间字符串转为时间戳字符串
public static String getStringTimestamp(String time) {
String timestamp = null;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-pR9J0zJ8-1713113885069)]
[外链图片转存中…(img-CDByZMwm-1713113885070)]
[外链图片转存中…(img-gM4b6UTd-1713113885070)]
[外链图片转存中…(img-IIXvtiRq-1713113885070)]
[外链图片转存中…(img-uVTZEn1W-1713113885071)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
这里我希望可以帮助到大家提升进阶。
内容包含:Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。
喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
到了这里,关于Android 天气APP(十四)修复UI显示异常、优化业务代码逻辑、增加详情天气显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!