前言
这篇文章接着上一篇来写的,主要是增加更多空气质量的数据展示和更多生活建议数据的展示。
先简单改动一下主页面的UI吧,打开activity_main.xml
温度的上方原来是天气描述,我给移到下面来了。
最高温和最低温,一分为二,我希望通过不同的字体颜色来表示高温和低温的区别,这样会更直观。
我在最高温和最低温的下面放上了空气质量和天气描述。 现在可以修改MainActivity中的代码了。
把原来的tvLowHeight注释掉,并且增加新的最高温最低温数据展示
在tvInfo所在位置增加一个星期的数据展示
再增加一个空气质量的展示。然后运行
OK,然后来改一下天气预报列表的样式
这是好久之前的了,抛开图标不谈我需要改左右两边文字的展示效果,修改item_weather_forecast_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/item_forecast"
android:foreground="@drawable/bg_white"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:gravity="center_vertical"
android:padding="@dimen/sp_12"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!--日期-->
<TextView
android:id="@+id/tv_date"
android:text="1234"
android:textSize="@dimen/sp_14"
android:textColor="#FFF"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"/>
<!--天气描述 文字 隐藏-->
<TextView
android:visibility="gone"
android:gravity="center"
android:id="@+id/tv_info"
android:textSize="@dimen/sp_14"
android:textColor="#FFF"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"/>
<!--天气描述 图标-->
<ImageView
android:id="@+id/iv_weather_state"
android:background="@mipmap/icon_100"
android:layout_width="30dp"
android:layout_height="30dp"/>
<!--最低温、最高温-->
<LinearLayout
android:gravity="right"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
android:layout_weight="1">
<TextView
android:id="@+id/tv_temp_height"
android:textSize="@dimen/sp_14"
android:textColor="#FFF"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_temp_low"
android:textSize="@dimen/sp_14"
android:textColor="@color/temp_min_tx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
就是把里面的温度地段改成了两个,用不同的颜色区分开,然后进入DailyAdapter
照着这个截图上面的修改就可以了,方法应该是都有的。 最后在渲染数据的时候增加动画
我在天气预报的返回和逐小时天气的返回数据中做了动画的渲染,注意到用了两个不同的动画,一个是底部往上弹,一个是从右往左弹。 运行之后效果如下
这样看起来可能舒服一些吧,
下面就要开始写更多空气质量的页面展示了。 老样子,在app的ui包下新建一个MoreAirActivity,然后修改布局 ,在修改之前我们先写一个自定义View,这当然也是需要样式的 在mvplibrary的styles.xml中新增一个样式
<!--线性进度条-->
<declare-styleable name="LineProgressbar">
<attr name="progressbar_width" format="dimension"/>
<attr name="progressbar_height" format="dimension"/>
</declare-styleable>
然后在mvplibrary的view包中新建一个LineProgressbar,代码如下:
package com.llw.mvplibrary.view;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import com.llw.mvplibrary.R;
public class LineProgressbar extends View {
private Paint mPaint;//画笔
private float mPaintWidth = 6f;//初始画笔宽度
private int mProgressbarWidth;//控件外边框宽度
private int mProgressbarHeight;//控件外边框高度
private int mPercent = 0;//已转化为0至100范围的当前进度,随动画时间改变而改变
public LineProgressbar(Context context) {
super(context);
}
@SuppressLint("Recycle")
public LineProgressbar(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.LineProgressbar);
mProgressbarWidth = (int) array.getDimension(R.styleable.LineProgressbar_progressbar_width, 100);
mProgressbarHeight = (int) array.getDimension(R.styleable.LineProgressbar_progressbar_height, 10);
}
public LineProgressbar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(mProgressbarWidth, mProgressbarHeight);
}
@Override
@SuppressLint("DrawAllocation")
protected void onDraw(Canvas canvas) {
mPaint = new Paint();
//绘制背景
mPaint.setColor(getResources().getColor(R.color.arc_bg_color));
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(mPaintWidth);
RectF frameRectF = new RectF(mPaintWidth, mPaintWidth, mProgressbarWidth - mPaintWidth, mProgressbarHeight - mPaintWidth);
canvas.drawRoundRect(frameRectF, 15, 15, mPaint);
//填充内部进度
mPaint.setPathEffect(null);
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
//内部进度填充长度,随动画时间改变而改变
float percent = (float) mPercent / 100f;
RectF progressRectF = new RectF(mPaintWidth, mPaintWidth, mPaintWidth + percent * (mProgressbarWidth - 2 * mPaintWidth - 2), mProgressbarHeight - mPaintWidth);
canvas.drawRoundRect(progressRectF, 15, 15, mPaint);
}
public void setProgress(String progress, int maxProgress) {
int percent = 0;
//得出当前progress占最大进度值百分比(0-100)
if (progress.contains(".")) {//float或者double类型
percent = ((int) Float.parseFloat(progress) * 10) * 100 / (maxProgress * 10);
} else {//int类型
percent = Integer.parseInt(progress) * 100 / maxProgress;
}
if (percent < 0) {
percent = 0;
}
if (percent > 100) {
percent = 100;
}
//属性动画
ValueAnimator animator = ValueAnimator.ofInt(0, percent);
animator.setDuration(1000);
animator.setInterpolator(new AccelerateInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
mPercent = (int) valueAnimator.getAnimatedValue();
invalidate();
}
});
animator.start();
}
}
现在可以看布局文件activity_more_air.xml了,代码如下: 里面用到的背景图片
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/more_air_bg"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context=".ui.MoreAirActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:contentInsetLeft="@dimen/dp_16"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navigationIcon="@mipmap/icon_return_white"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="更多空气质量"
android:textColor="@color/white"
android:textSize="@dimen/sp_16" />
</androidx.appcompat.widget.Toolbar>
<androidx.core.widget.NestedScrollView
android:overScrollMode="never"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--实时空气质量-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_12"
android:background="@drawable/shape_transparent_12"
android:orientation="vertical"
android:padding="@dimen/dp_12">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="实时空气质量"
android:textColor="@color/white"
android:textSize="@dimen/sp_16" />
<TextView
android:id="@+id/tv_old_time"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="right"
android:text="上次更新时间:"
android:textColor="@color/white"
android:textSize="@dimen/sp_12" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_12">
<!--污染指数 动画展示-->
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="污染指数"
android:textColor="#DAEBEE"
android:textSize="14sp" />
<!--显示污染指数进度值-->
<com.llw.mvplibrary.view.RoundProgressBar
android:id="@+id/rpb_aqi"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_gravity="center"
app:round_bg_color="#C6D7F4"
app:round_progress_color="#FBFEF7" />
</LinearLayout>
<!--其他指数-->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<!--PM10-->
<LinearLayout
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="@dimen/dp_44"
android:layout_height="wrap_content"
android:gravity="center"
android:text="PM10"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<com.llw.mvplibrary.view.LineProgressbar
android:id="@+id/progress_pm10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
app:progressbar_width="@dimen/dp_80"
app:progressbar_height="@dimen/dp_10"/>
<TextView
android:id="@+id/tv_pm10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--PM2.5-->
<LinearLayout
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<TextView
android:layout_width="@dimen/dp_44"
android:layout_height="wrap_content"
android:gravity="center"
android:text="PM2.5"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<com.llw.mvplibrary.view.LineProgressbar
android:id="@+id/progress_pm25"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
app:progressbar_width="@dimen/dp_80"
app:progressbar_height="@dimen/dp_10"/>
<TextView
android:id="@+id/tv_pm25"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--NO2 二氧化氮-->
<LinearLayout
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<LinearLayout
android:layout_width="@dimen/dp_44"
android:layout_height="wrap_content"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="NO"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2"
android:textColor="@color/blue_one"
android:textSize="8sp" />
</LinearLayout>
<com.llw.mvplibrary.view.LineProgressbar
android:id="@+id/progress_no2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
app:progressbar_width="@dimen/dp_80"
app:progressbar_height="@dimen/dp_10"/>
<TextView
android:id="@+id/tv_no2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--SO2 二氧化硫-->
<LinearLayout
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<LinearLayout
android:layout_width="@dimen/dp_44"
android:layout_height="wrap_content"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SO"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2"
android:textColor="@color/blue_one"
android:textSize="8sp" />
</LinearLayout>
<com.llw.mvplibrary.view.LineProgressbar
android:id="@+id/progress_so2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
app:progressbar_width="@dimen/dp_80"
app:progressbar_height="@dimen/dp_10"/>
<TextView
android:id="@+id/tv_so2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--O3 臭氧-->
<LinearLayout
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<LinearLayout
android:layout_width="@dimen/dp_44"
android:layout_height="wrap_content"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="O"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3"
android:textColor="@color/blue_one"
android:textSize="8sp" />
</LinearLayout>
<com.llw.mvplibrary.view.LineProgressbar
android:id="@+id/progress_o3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
app:progressbar_width="@dimen/dp_80"
app:progressbar_height="@dimen/dp_10"/>
<TextView
android:id="@+id/tv_o3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--CO 一氧化碳-->
<LinearLayout
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<TextView
android:layout_width="@dimen/dp_44"
android:layout_height="wrap_content"
android:gravity="center"
android:text="CO"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<com.llw.mvplibrary.view.LineProgressbar
android:id="@+id/progress_co"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
app:progressbar_width="@dimen/dp_80"
app:progressbar_height="@dimen/dp_10"/>
<TextView
android:id="@+id/tv_co"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<TextView
android:layout_marginLeft="@dimen/dp_12"
android:text="监测站空气质量"
android:textColor="@color/white"
android:textSize="@dimen/sp_16"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<!--国控站点空气质量列表-->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_station"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never" />
<TextView
android:layout_marginLeft="@dimen/dp_12"
android:text="未来5天空气质量预报"
android:textColor="@color/white"
android:textSize="@dimen/sp_16"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_five_air"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp_12"
android:overScrollMode="never" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>
现在可以创建item的布局文件里,这里面有两个列表,自然就需要两个item的布局, 先来看第一个的布局,在layout下新建一个item_more_air_station_list.xml,这个用于展示检测站的空气质量。代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/dp_12">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/shape_transparent_12"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="@dimen/dp_12">
<!--站点名称-->
<TextView
android:id="@+id/tv_station_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="@dimen/sp_18" />
<!--其他指数-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_20"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="空气质量"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_air_category"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_12"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="空气质量指数"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_aqi"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_12"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="主要污染物"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_primary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--PM10-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="PM10"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_pm10"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--PM2.5-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="PM2.5"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_pm25"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--NO2 二氧化氮-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="二氧化氮"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_no2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--SO2 二氧化硫-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="二氧化硫"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_so2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--O3 臭氧-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="一氧化碳"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_o3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
<!--CO 一氧化碳-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="臭氧"
android:textColor="@color/blue_one"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_co"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
比较的简单,下面在layout下创建item_more_air_five_list.xml,用于展示当前城市未来五天的空气质量预报。布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/dp_12">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@drawable/shape_transparent_12"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="@dimen/dp_12">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tv_date_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="@dimen/sp_18" />
<TextView
android:id="@+id/tv_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="@dimen/sp_14" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AQI指数"
android:textColor="@color/white" />
<TextView
android:id="@+id/tv_aqi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_20"
android:text="空气质量"
android:textColor="@color/white" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_4">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="空气质量"
android:textColor="@color/white" />
<TextView
android:id="@+id/tv_category"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_20"
android:text="空气质量"
android:textColor="@color/white" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_4">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="污染物"
android:textColor="@color/white" />
<TextView
android:id="@+id/tv_primary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_20"
android:text="空气质量"
android:textColor="@color/white" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
因为这个查询多天的空气质量之前并没有写上去,所以要在ApiService中新增一个,同时需要在app的bean包下面新建一个数据实体MoreAirFiveResponse,代码如下:
package com.llw.goodweather.bean;
import java.util.List;
public class MoreAirFiveResponse {
/**
* code : 200
* updateTime : 2020-08-06T09:28+08:00
* fxLink : http://hfx.link/2ax4
* daily : [{"fxDate":"2020-08-06","aqi":"60","level":"2","category":"良","primary":"NA"},{"fxDate":"2020-08-07","aqi":"90","level":"2","category":"良","primary":"NA"},{"fxDate":"2020-08-08","aqi":"100","level":"2","category":"良","primary":"NA"},{"fxDate":"2020-08-09","aqi":"110","level":"3","category":"轻度污染","primary":"NA"},{"fxDate":"2020-08-10","aqi":"90","level":"2","category":"良","primary":"NA"}]
* refer : {"sources":["cnemc"],"license":["no commercial use"]}
*/
private String code;
private String updateTime;
private String fxLink;
private ReferBean refer;
private List<DailyBean> daily;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getFxLink() {
return fxLink;
}
public void setFxLink(String fxLink) {
this.fxLink = fxLink;
}
public ReferBean getRefer() {
return refer;
}
public void setRefer(ReferBean refer) {
this.refer = refer;
}
public List<DailyBean> getDaily() {
return daily;
}
public void setDaily(List<DailyBean> daily) {
this.daily = daily;
}
public static class ReferBean {
private List<String> sources;
private List<String> license;
public List<String> getSources() {
return sources;
}
public void setSources(List<String> sources) {
this.sources = sources;
}
public List<String> getLicense() {
return license;
}
public void setLicense(List<String> license) {
this.license = license;
}
}
public static class DailyBean {
/**
* fxDate : 2020-08-06
* aqi : 60
* level : 2
* category : 良
* primary : NA
*/
private String fxDate;
private String aqi;
private String level;
private String category;
private String primary;
public String getFxDate() {
return fxDate;
}
public void setFxDate(String fxDate) {
this.fxDate = fxDate;
}
public String getAqi() {
return aqi;
}
public void setAqi(String aqi) {
this.aqi = aqi;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getPrimary() {
return primary;
}
public void setPrimary(String primary) {
this.primary = primary;
}
}
}
ApiService中新增如下接口
/**
* 空气质量5天预报
*
* @param location 城市id
* @return 返回空气质量5天预报数据
*/
@GET("/v7/air/5d?key=3086e91d66c04ce588a7f538f917c7f4")
Call<MoreAirFiveResponse> airFiveWeather(@Query("location") String location);
现在可以创建一个新的订阅器了,在app的contract包下新建一个MoreAirContract,代码如下:
package com.llw.goodweather.contract;
import com.llw.goodweather.api.ApiService;
import com.llw.goodweather.bean.AirNowResponse;
import com.llw.goodweather.bean.DailyResponse;
import com.llw.goodweather.bean.MoreAirFiveResponse;
import com.llw.goodweather.bean.NewSearchCityResponse;
import com.llw.mvplibrary.base.BasePresenter;
import com.llw.mvplibrary.base.BaseView;
import com.llw.mvplibrary.net.NetCallBack;
import com.llw.mvplibrary.net.ServiceGenerator;
import retrofit2.Call;
import retrofit2.Response;
/**
* 更多空气质量数据订阅器
*/
public class MoreAirContract {
public static class MoreAirPresenter extends BasePresenter<IMoreAirView> {
/**
* 搜索城市 搜索站点的城市id,用于查询空气质量
* @param location 城市名
*/
public void searchCityId(String location) {//注意这里的4表示新的搜索城市地址接口
ApiService service = ServiceGenerator.createService(ApiService.class, 4);//指明访问的地址
service.newSearchCity(location,"exact").enqueue(new NetCallBack<NewSearchCityResponse>() {
@Override
public void onSuccess(Call<NewSearchCityResponse> call, Response<NewSearchCityResponse> response) {
if(getView() != null){
getView().getSearchCityIdResult(response);
}
}
@Override
public void onFailed() {
if(getView() != null){
getView().getDataFailed();
}
}
});
}
/**
* 空气质量 V7
* @param location 城市id
*/
public void air(String location) {
ApiService service = ServiceGenerator.createService(ApiService.class,3);
service.airNowWeather(location).enqueue(new NetCallBack<AirNowResponse>() {
@Override
public void onSuccess(Call<AirNowResponse> call, Response<AirNowResponse> response) {
if(getView() != null){
getView().getMoreAirResult(response);
}
}
@Override
public void onFailed() {
if(getView() != null){
getView().getDataFailed();
}
}
});
}
/**
* 五天空气质量数据 V7
* @param location 城市id
*/
public void airFive(String location) {
ApiService service = ServiceGenerator.createService(ApiService.class,3);
service.airFiveWeather(location).enqueue(new NetCallBack<MoreAirFiveResponse>() {
@Override
public void onSuccess(Call<MoreAirFiveResponse> call, Response<MoreAirFiveResponse> response) {
if(getView() != null){
getView().getMoreAirFiveResult(response);
}
}
@Override
public void onFailed() {
if(getView() != null){
getView().getDataFailed();
}
}
});
}
}
public interface IMoreAirView extends BaseView {
//搜索城市Id
void getSearchCityIdResult(Response<NewSearchCityResponse> response);
//空气质量返回数据 V7
void getMoreAirResult(Response<AirNowResponse> response);
//五天空气质量数据返回 V7
void getMoreAirFiveResult(Response<MoreAirFiveResponse> response);
//错误返回
void getDataFailed();
}
}
里面有三个请求和返回以及一个异常返回,因为空气质量比较特殊,所以我需要先使用搜索城市接口,将MainActivity中传递过来的上级城市(监测站)先查询一次,得到这个城市的id,再通过这个id去请求当前空气质量和未来五天空气质量的接口,这样才能拿到数据。以便于展示。 下面创建两个列表数据适配器,在app的adapter包下新建MoreAirStationAdapter,用于展示检测站点的数据
package com.llw.goodweather.adapter;
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.AirNowResponse;
import java.util.List;
/**
* 更多空气质量之空气站点列表适配器
*/
public class MoreAirStationAdapter extends BaseQuickAdapter<AirNowResponse.StationBean, BaseViewHolder> {
public MoreAirStationAdapter(int layoutResId, @Nullable List<AirNowResponse.StationBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, AirNowResponse.StationBean item) {
helper.setText(R.id.tv_station_name, item.getName())//监测站名称
.setText(R.id.tv_air_category, item.getCategory())//空气质量
.setText(R.id.tv_aqi, item.getAqi())//空气质量指数
.setText(R.id.tv_primary, item.getPrimary().equals("NA") ? "无污染" : item.getPrimary())//污染物
.setText(R.id.tv_pm10, item.getPm10())//pm10
.setText(R.id.tv_pm25, item.getPm2p5())//pm2.5
.setText(R.id.tv_no2, item.getNo2())//二氧化氮
.setText(R.id.tv_so2, item.getSo2())//二氧化硫
.setText(R.id.tv_o3, item.getO3())//臭氧
.setText(R.id.tv_co, item.getCo());//一氧化碳
}
}
OK,再创建一个MoreAirFiveAdapter,代码如下:
package com.llw.goodweather.adapter;
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.MoreAirFiveResponse;
import com.llw.goodweather.utils.DateUtils;
import java.util.List;
/**
* 5天空气质量预报适配器
*/
public class MoreAirFiveAdapter extends BaseQuickAdapter<MoreAirFiveResponse.DailyBean, BaseViewHolder> {
public MoreAirFiveAdapter(int layoutResId, @Nullable List<MoreAirFiveResponse.DailyBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, MoreAirFiveResponse.DailyBean item) {
helper.setText(R.id.tv_date_info, DateUtils.Week(item.getFxDate()))//日期描述
.setText(R.id.tv_date, DateUtils.dateSplit(item.getFxDate()))//日期
.setText(R.id.tv_aqi,item.getAqi())//空气质量指数
.setText(R.id.tv_category,item.getCategory())//空气质量描述
.setText(R.id.tv_primary, item.getPrimary().equals("NA") ? "无污染" : item.getPrimary());//污染物
}
}
然后进入到MoreAirActivity,里面的代码如下:
package com.llw.goodweather.ui;
import android.os.Build;
import android.os.Bundle;
import android.widget.TextView;
import androidx.annotation.RequiresApi;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.PagerSnapHelper;
import androidx.recyclerview.widget.RecyclerView;
import com.llw.goodweather.R;
import com.llw.goodweather.adapter.MoreAirFiveAdapter;
import com.llw.goodweather.adapter.MoreAirStationAdapter;
import com.llw.goodweather.bean.AirNowResponse;
import com.llw.goodweather.bean.MoreAirFiveResponse;
import com.llw.goodweather.bean.NewSearchCityResponse;
import com.llw.goodweather.contract.MoreAirContract;
import com.llw.goodweather.utils.CodeToStringUtils;
import com.llw.goodweather.utils.Constant;
import com.llw.goodweather.utils.DateUtils;
import com.llw.mvplibrary.view.LineProgressbar;
import com.llw.goodweather.utils.StatusBarUtil;
import com.llw.goodweather.utils.ToastUtils;
import com.llw.goodweather.utils.WeatherUtil;
import com.llw.mvplibrary.mvp.MvpActivity;
import com.llw.mvplibrary.view.RoundProgressBar;
import java.util.List;
import butterknife.BindView;
import retrofit2.Response;
/**
* 更多空气质量信息
*/
public class MoreAirActivity extends MvpActivity<MoreAirContract.MoreAirPresenter> implements MoreAirContract.IMoreAirView {
@BindView(R.id.tv_title)
TextView tvTitle;//标题
@BindView(R.id.toolbar)
Toolbar toolbar;//toolbar
@BindView(R.id.rpb_aqi)
RoundProgressBar rpbAqi;//圆环进度条
@BindView(R.id.tv_pm10)
TextView tvPm10;//pm10
@BindView(R.id.tv_pm25)
TextView tvPm25;//pm2.5
@BindView(R.id.tv_no2)
TextView tvNo2;//二氧化氮
@BindView(R.id.tv_so2)
TextView tvSo2;//二氧化硫
@BindView(R.id.tv_o3)
TextView tvO3;//臭氧
@BindView(R.id.tv_co)
TextView tvCo;//一氧化碳
@BindView(R.id.tv_old_time)
TextView tvOldTime;//最近更新时间
@BindView(R.id.rv_station)
RecyclerView rvStation;//检测站数据列表
@BindView(R.id.progress_pm10)
LineProgressbar progressPm10;//pm10含量进度条展示
@BindView(R.id.progress_pm25)
LineProgressbar progressPm25;//pm2.5含量进度条展示
@BindView(R.id.progress_no2)
LineProgressbar progressNo2;//二氧化氮含量进度条展示
@BindView(R.id.progress_so2)
LineProgressbar progressSo2;//二氧化硫含量进度条展示
@BindView(R.id.progress_o3)
LineProgressbar progressO3;//臭氧含量进度条展示
@BindView(R.id.progress_co)
LineProgressbar progressCo;//一氧化碳含量进度条展示
@BindView(R.id.rv_five_air)
RecyclerView rvFiveAir;//最近5天空气质量列表
@Override
public void initData(Bundle savedInstanceState) {
StatusBarUtil.transparencyBar(context);//透明状态栏
Back(toolbar);
showLoadingDialog();
String stationName = getIntent().getStringExtra("stationName");
tvTitle.setText(stationName + " - " + getIntent().getStringExtra("cityName"));
mPresent.searchCityId(stationName);//搜索城市返回Id
}
@Override
public int getLayoutId() {
return R.layout.activity_more_air;
}
@Override
protected MoreAirContract.MoreAirPresenter createPresent() {
return new MoreAirContract.MoreAirPresenter();
}
/**
* 搜索城市返回Id 通过id查询城市的空气质量和站点空气质量
*
* @param response
*/
@Override
public void getSearchCityIdResult(Response<NewSearchCityResponse> response) {
dismissLoadingDialog();
if (response.body().getStatus().equals(Constant.SUCCESS_CODE)) {
showLoadingDialog();
List<NewSearchCityResponse.LocationBean> data = response.body().getLocation();
if (data != null && data.size() > 0) {
mPresent.air(data.get(0).getId());//查询该站点的空气质量数据
mPresent.airFive(data.get(0).getId());//查询该站点的空气质量数据
} else {
ToastUtils.showShortToast(context, "未查询到相关数据");
}
} else {
ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getStatus()));
}
}
/**
* 更多空气质量的数据展示
*
* @param response
*/
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void getMoreAirResult(Response<AirNowResponse> response) {
dismissLoadingDialog();
if (response.body().getCode().equals(Constant.SUCCESS_CODE)) {
AirNowResponse.NowBean data = response.body().getNow();
List<AirNowResponse.StationBean> station = response.body().getStation();
if (response.body().getNow() != null) {
String time = DateUtils.updateTime(response.body().getUpdateTime());//截去前面的字符,保留后面所有的字符,就剩下 22:00
tvOldTime.setText("最近更新时间:" + WeatherUtil.showTimeInfo(time) + time);
showAirBasicData(data);//展示基础数据
//展示检测站列表数据
MoreAirStationAdapter mAdapter = new MoreAirStationAdapter(R.layout.item_more_air_station_list, station);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
rvStation.setLayoutManager(linearLayoutManager);
PagerSnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(rvStation);//滚动对齐,使RecyclerView像ViewPage一样,一次滑动一项,居中
rvStation.setAdapter(mAdapter);
} else {
ToastUtils.showShortToast(context, "空气质量数据为空");
}
} else {
ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getCode()));
}
}
/**
* 未来5天空气质量返回
*
* @param response
*/
@Override
public void getMoreAirFiveResult(Response<MoreAirFiveResponse> response) {
if (response.body().getCode().equals(Constant.SUCCESS_CODE)) {
List<MoreAirFiveResponse.DailyBean> data = response.body().getDaily();
if (data != null && data.size() > 0) {
MoreAirFiveAdapter adapter = new MoreAirFiveAdapter(R.layout.item_more_air_five_list, data);
LinearLayoutManager manager = new LinearLayoutManager(context);
manager.setOrientation(RecyclerView.HORIZONTAL);
rvFiveAir.setLayoutManager(manager);
rvFiveAir.setAdapter(adapter);
} else {
ToastUtils.showShortToast(context, "未来5天空气质量数据为空");
}
} else {
ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getCode()));
}
}
/**
* 展示基础数据
*
* @param data 数据源
*/
private void showAirBasicData(AirNowResponse.NowBean data) {
rpbAqi.setMaxProgress(300);//最大进度,用于计算
rpbAqi.setMinText("0");//设置显示最小值
rpbAqi.setMinTextSize(32f);
rpbAqi.setMaxText("300");//设置显示最大值
rpbAqi.setMaxTextSize(32f);
rpbAqi.setProgress(Float.valueOf(data.getAqi()));//当前进度
rpbAqi.setArcBgColor(getResources().getColor(R.color.arc_bg_color));//圆弧的颜色
rpbAqi.setProgressColor(getResources().getColor(R.color.arc_progress_color));//进度圆弧的颜色
rpbAqi.setFirstText(data.getCategory());//空气质量描述 取值范围:优,良,轻度污染,中度污染,重度污染,严重污染
rpbAqi.setFirstTextSize(44f);//第一行文本的字体大小
rpbAqi.setSecondText(data.getAqi());//空气质量值
rpbAqi.setSecondTextSize(64f);//第二行文本的字体大小
rpbAqi.setMinText("0");
rpbAqi.setMinTextColor(getResources().getColor(R.color.arc_progress_color));
tvPm10.setText(data.getPm10());//PM10 + " μg/m3"
progressPm10.setProgress(data.getPm10(), 100);
tvPm25.setText(data.getPm2p5());//PM2.5
progressPm25.setProgress(data.getPm2p5(), 100);
tvNo2.setText(data.getNo2());//二氧化氮
progressNo2.setProgress(data.getNo2(), 100);
tvSo2.setText(data.getSo2());//二氧化硫
progressSo2.setProgress(data.getSo2(), 100);
tvO3.setText(data.getO3());//臭氧
progressO3.setProgress(data.getO3(), 100);
tvCo.setText(data.getCo());//一氧化碳
progressCo.setProgress(data.getCo(), 100);
}
/**
* 其他异常返回
*/
@Override
public void getDataFailed() {
dismissLoadingDialog();
ToastUtils.showShortToast(context, "更多空气质量数据获取异常");
}
}
注意到
我在initData的时候获取intent携带的数据,检测站名称,这就说明我要在MainActivity中进行传递才行,否则你进这个页面就会空指针的。下面进入到MainActivity.
在搜索城市返回时获取到这个检测站的名称,stationName是在上一篇就创建了,如果你没有的话就创建就可以了
private String stationName = null;
现在已经赋值了,然后在goToMore中增加一个传递过去的参数,这样就不会报错了。
跳转进入
指定到这个MoreAirActivity,现在就可以运行测试一下了。
下面来写更多生活建议数据展示,app的ui包下新建MoreLifestyleActivity, 背景图
activity_more_lifestyle.xml布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true"
android:background="@drawable/more_lifestyle"
tools:context=".ui.MoreLifestyleActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:contentInsetLeft="@dimen/dp_16"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navigationIcon="@mipmap/icon_return_white"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="更多生活建议"
android:textColor="@color/white"
android:textSize="@dimen/sp_18" />
</androidx.appcompat.widget.Toolbar>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:overScrollMode="never"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
然后写item的布局,在app的layout下新建一个item_more_lifestyle_list.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/dp_12">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/shape_transparent_12"
android:orientation="vertical"
android:padding="@dimen/dp_12">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="@dimen/sp_16" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_4"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/dp_8"
android:text="指数等级"
android:textColor="@color/white"
android:textSize="@dimen/sp_12" />
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="0dp"
android:layout_height="6dp"
android:layout_weight="1"
android:max="10"
android:progress="10"
android:progressDrawable="@drawable/progress_bg"
android:visibility="visible" />
</LinearLayout>
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_4"
android:textColor="@color/white"
android:textSize="@dimen/sp_12" />
</LinearLayout>
</LinearLayout>
里面用到了一个样式progress_bg.xml,在drawable下创建一个,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--背景效果(浅灰色)-->
<item android:id="@android:id/background">
<shape>
<corners android:radius="40dp" />
<solid android:color="#0c000000"/>
</shape>
</item>
<!--第一进度条背景(渐变),clip:裁剪进度条右侧部分-->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="40dp" />
<gradient
android:angle="180"
android:startColor="#50ACEE"
android:centerColor="#6ACCF1"
android:endColor="#76EAE7" />
</shape>
</clip>
</item>
</layer-list>
然后在app下的adapter包下新建一个MoreLifestyleAdapter,代码如下:
package com.llw.goodweather.adapter;
import android.widget.ProgressBar;
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.LifestyleResponse;
import java.util.List;
public class MoreLifestyleAdapter extends BaseQuickAdapter<LifestyleResponse.DailyBean, BaseViewHolder> {
public MoreLifestyleAdapter(int layoutResId, @Nullable List<LifestyleResponse.DailyBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, LifestyleResponse.DailyBean item) {
helper.setText(R.id.tv_name, item.getName());//名称
helper.setText(R.id.tv_content, "生活建议:"+item.getText());//内容
ProgressBar progressBar = helper.getView(R.id.progressBar);
String type = item.getType();
int level = Integer.parseInt(item.getLevel());
switch (type) {//根据不同的类型设置不同的最大进度
case "1"://运动指数 1 适宜(1)、较适宜(2)、较不宜(3)
case "4"://钓鱼指数 4 适宜(1)、较适宜(2)、不宜(3)
progressBar.setMax(3);
break;
case "2"://洗车指数 2 适宜(1)、较适宜(2)、较不宜(3)、不宜(4)
case "9"://感冒指数 9 少发(1)、较易发(2)、易发(3)、极易发(4)
case "11"://空调开启指数 11 长时间开启(1)、部分时间开启(2)、较少开启(3)、开启制暖空调(4)
progressBar.setMax(4);
break;
case "5"://紫外线指数 5 最弱(1)、弱(2)、中等(3)、强(4)、很强(5)
case "6"://旅游指数 6 适宜(1)、较适宜(2)、一般(3)、较不宜(4)、不适宜(5)
case "7"://花粉过敏指数 7 极不易发(1)、不易发(2)、较易发(3)、易发(4)、极易发(5)
case "10"://空气污染扩散条件指数 10 优(1)、良(2)、中(3)、较差(4)、很差(5)
case "12"://太阳镜指数 12 不需要(1)、需要(2)、必要(3)、很必要(4)、非常必要(5)
case "15"://交通指数 15 良好(1)、较好(2)、一般(3)、较差(4)、很差(5)
case "16"://防晒指数 16 弱(1)、较弱(2)、中等(3)、强(4)、极强(5)
progressBar.setMax(5);
break;
case "14"://晾晒指数 14 极适宜(1)、适宜(2)、基本适宜(3)、不太适宜(4)、不宜(5)、不适宜(6)
progressBar.setMax(6);
break;
case "3"://穿衣指数 3 寒冷(1)、冷(2)、较冷(3)、较舒适(4)、舒适(5)、热(6)、炎热(7)
case "8"://舒适度指数 8 舒适(1)、较舒适(2)、较不舒适(3)、很不舒适(4)、极不舒适(5)、不舒适(6)、非常不舒适(7)
progressBar.setMax(7);
break;
case "13"://化妆指数 13 保湿(1)、保湿防晒(2)、去油防晒(3)、防脱水防晒(4)、去油(5)、防脱水(6)、防晒(7)、滋润保湿(8)
progressBar.setMax(8);
break;
}
progressBar.setProgress(level);//当前等级
}
}
下面就是订阅器,在app下的contract包下新建一个MoreLifestyleContract,代码如下:
package com.llw.goodweather.contract;
import com.llw.goodweather.api.ApiService;
import com.llw.goodweather.bean.DailyResponse;
import com.llw.goodweather.bean.LifestyleResponse;
import com.llw.mvplibrary.base.BasePresenter;
import com.llw.mvplibrary.base.BaseView;
import com.llw.mvplibrary.net.NetCallBack;
import com.llw.mvplibrary.net.ServiceGenerator;
import retrofit2.Call;
import retrofit2.Response;
/**
* 更多生活指数订阅器
*/
public class MoreLifestyleContract {
public static class MoreLifestylePresenter extends BasePresenter<IMoreLifestyleView> {
/**
* 更多生活指数 V7
* @param location 城市id
*/
public void worldCity(String location) {
ApiService service = ServiceGenerator.createService(ApiService.class,3);
service.lifestyle("0",location).enqueue(new NetCallBack<LifestyleResponse>() {
@Override
public void onSuccess(Call<LifestyleResponse> call, Response<LifestyleResponse> response) {
if(getView() != null){
getView().getMoreLifestyleResult(response);
}
}
@Override
public void onFailed() {
if(getView() != null){
getView().getDataFailed();
}
}
});
}
}
public interface IMoreLifestyleView extends BaseView {
//更多生活指数返回数据 V7
void getMoreLifestyleResult(Response<LifestyleResponse> response);
//错误返回
void getDataFailed();
}
}
然后再回到MoreLifestyleActivity,代码如下:
package com.llw.goodweather.ui;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.llw.goodweather.R;
import com.llw.goodweather.adapter.MoreLifestyleAdapter;
import com.llw.goodweather.bean.LifestyleResponse;
import com.llw.goodweather.contract.MoreLifestyleContract;
import com.llw.goodweather.utils.CodeToStringUtils;
import com.llw.goodweather.utils.Constant;
import com.llw.goodweather.utils.StatusBarUtil;
import com.llw.goodweather.utils.ToastUtils;
import com.llw.mvplibrary.mvp.MvpActivity;
import com.llw.mvplibrary.utils.RecyclerViewAnimation;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Response;
import static com.llw.mvplibrary.utils.RecyclerViewAnimation.runLayoutAnimation;
/**
* 更多生活指数信息
*/
public class MoreLifestyleActivity extends MvpActivity<MoreLifestyleContract.MoreLifestylePresenter> implements MoreLifestyleContract.IMoreLifestyleView {
@BindView(R.id.tv_title)
TextView tvTitle;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.rv)
RecyclerView rv;
@Override
public void initData(Bundle savedInstanceState) {
StatusBarUtil.transparencyBar(context);//透明状态栏
Back(toolbar);
showLoadingDialog();
tvTitle.setText(getIntent().getStringExtra("cityName"));
mPresent.worldCity(getIntent().getStringExtra("locationId"));
}
@Override
public int getLayoutId() {
return R.layout.activity_more_lifestyle;
}
@Override
protected MoreLifestyleContract.MoreLifestylePresenter createPresent() {
return new MoreLifestyleContract.MoreLifestylePresenter();
}
/**
* 更多生活质量数据返回
*
* @param response
*/
@Override
public void getMoreLifestyleResult(Response<LifestyleResponse> response) {
dismissLoadingDialog();
if (response.body().getCode().equals(Constant.SUCCESS_CODE)) {
List<LifestyleResponse.DailyBean> data = response.body().getDaily();
if (data != null && data.size() > 0) {
MoreLifestyleAdapter adapter = new MoreLifestyleAdapter(R.layout.item_more_lifestyle_list, data);
rv.setLayoutManager(new LinearLayoutManager(context));
rv.setAdapter(adapter);
runLayoutAnimation(rv);
} else {
ToastUtils.showShortToast(context, "生活质量数据为空");
}
} else {
ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getCode()));
}
}
/**
* 其他异常返回
*/
@Override
public void getDataFailed() {
dismissLoadingDialog();
ToastUtils.showShortToast(context, "更多天气数据获取异常");
}
}
最后修改MainActivity中的
然后运行: