上一篇:Android 天气APP(三十一)每日提醒弹窗

快捷切换常用城市及每日弹窗优化

  • 前言
  • 正文
    • 一、创建适配器
    • 二、配置列表加载常用城市数据
    • 三、添加到常用城市列表
    • 四、修改UI
  • 文末

前言

  在2021年正式到来之前再更新几篇天气APP的文章,说实话现在对于这个APP的更新速度是比较缓慢的,一方面我有工作在进行,同时在写其他的文章,其次我正在使用Kotlin语言重写天气APP,还有一个原因就是功能的迭代问题,因为作为天气APP该满足用户的其实都已经满足了,我本来还有好多的想法打算加进去,又怕这个变得不伦不类,因此有些东西就搁置了,而这篇文章就是在对于用户的体验上做提升,嗯,来看看吧。


正文

  快捷切换城市自然要在App的主页面进行了,那么首先修改一下布局文件activity_main.xml。

                     <!--切换城市--><!--常用城市快捷切换--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:animateLayoutChanges="true"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_change_city"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="12dp"android:visibility="gone" /></LinearLayout>

放置的位置就在城市的下方,只不过是隐藏的列表,所以你还看不见的。

然后在MainActivity绑定控件

 @BindView(R.id.rv_change_city)RecyclerView rvChangeCity;//点击切换常用城市

再创建两个变量用于控制是否显示和是否展开常用城市列表

 private boolean changeCityState = false;//常用城市列表  收缩状态  false 收缩  true 展开private boolean isChangeCity = false;//是否可以展开,如果没有添加常用城市,自然不能展开

一、创建适配器

  既然有列表自然就有适配器。然后在layout中创建一个item_main_city_change.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tv_city"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/selected_bg_color"android:paddingStart="@dimen/dp_16"android:paddingTop="@dimen/dp_4"android:paddingEnd="@dimen/dp_16"android:paddingBottom="@dimen/dp_4"android:text="常用城市"android:textColor="@drawable/selected_text_color"android:textSize="@dimen/sp_18" />

这里我改变了触摸item时的背景样式和文字颜色样式,样式都放在drawable下。
selected_bg_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true" android:drawable="@drawable/selected_bg_radius"/></selector>

selected_bg_radius.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="@color/white_4"/><corners android:radius="@dimen/dp_12"/>
</shape>

selected_text_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true" android:color="@color/white"/><item android:state_pressed="false" android:color="@color/white_8"/>
</selector>

item写完了,下面到适配器了。
在adapter包下新建一个MainChangeCommonlyCityAdapter类,代码如下:

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.mvplibrary.bean.ResidentCity;import java.util.List;/*** 主页面左右滑动切换常用城市列表适配器** @author llw*/
public class MainChangeCommonlyCityAdapter extends BaseQuickAdapter<ResidentCity, BaseViewHolder> {public MainChangeCommonlyCityAdapter(int layoutResId, @Nullable List<ResidentCity> data) {super(layoutResId, data);}@Overrideprotected void convert(BaseViewHolder helper, ResidentCity item) {helper.setText(R.id.tv_city, item.getLocation()).addOnClickListener(R.id.tv_city);}
}

二、配置列表加载常用城市数据

刚才适配器写好了,然后进入到MainActivity中,再创建两个变量

 //主页面切换城市列表适配器private MainChangeCommonlyCityAdapter changeCityAdapter;//常用城市切换列表private List<ResidentCity> residentCityList = new ArrayList<>();

一个适配器一个数据列表,然后下面新增一个方法用于加载适配器数据并且渲染,还有点击事件。这里先查询数据,然后判断数据,之后渲染数据,最后是点击item之后搜索城市,然后查找天气数据。

 /*** 加载常用城市数据*/private void loadingCommonlyUsedCity() {residentCityList = LitePal.findAll(ResidentCity.class);//先判断是否有常用城市if (residentCityList != null && residentCityList.size() > 0) {isChangeCity = true;} else {isChangeCity = false;}//配置适配器changeCityAdapter = new MainChangeCommonlyCityAdapter(R.layout.item_main_city_change, residentCityList);LinearLayoutManager manager = new LinearLayoutManager(context);manager.setOrientation(RecyclerView.HORIZONTAL);rvChangeCity.setLayoutManager(manager);rvChangeCity.setAdapter(changeCityAdapter);//常用城市点击changeCityAdapter.setOnItemChildClickListener((adapter, view, position) -> {showLoadingDialog();district = residentCityList.get(position).getLocation();mPresent.newSearchCity(district);flag = false;//隐藏列表rvChangeCity.setVisibility(View.GONE);changeCityState = false;});}

三、添加到常用城市列表

这里我判断了一下是否为定位城市的返回,是的话我就添加到数据库中,当然也不能重复添加数据,因此还需要判断一下。

 /*** 添加到常用城市列表** @param locationBean*/private void addCommonlyUsedCity(NewSearchCityResponse.LocationBean locationBean) {if (flag) {//定位到的城市List<ResidentCity> residentCityList = LitePal.findAll(ResidentCity.class);if (residentCityList != null && residentCityList.size() > 0) {//查询要添加的城市是否已经存在List<ResidentCity> residentCities = LitePal.where("location = ? and parent_city = ?", locationBean.getName(), locationBean.getAdm2()).find(ResidentCity.class);if (residentCities.size() == 0) {ResidentCity residentCity = new ResidentCity();residentCity.setLocation(locationBean.getName());//地区/城市名称residentCity.setParent_city(locationBean.getAdm2());//该地区/城市的上级城市residentCity.setAdmin_area(locationBean.getAdm1());//该地区/城市所属行政区域residentCity.setCnty(locationBean.getCountry());//该地区/城市所属国家名称residentCity.save();//保存数据到数据库中}} else {ResidentCity residentCity = new ResidentCity();residentCity.setLocation(locationBean.getName());//地区/城市名称residentCity.setParent_city(locationBean.getAdm2());//该地区/城市的上级城市residentCity.setAdmin_area(locationBean.getAdm1());//该地区/城市所属行政区域residentCity.setCnty(locationBean.getCountry());//该地区/城市所属国家名称residentCity.save();//保存数据到数据库中}}//加载常用城市数据loadingCommonlyUsedCity();}


然后你还需要在initData中调用loadingCommonlyUsedCity方法。

其次就是在接收事件的时候再加载一次数据,因为我在常用城市中添加数据之后会发起事件,然后关闭常用城市页面,回到主页面,此时需要把数据加载一下,后面会演示一下。

四、修改UI

  因为我是点击城市触发常用城市列表的判断处理,因此之前的代码需要修改一下,有两处,在initData中

在onReceiveLocation方法中

最后在tv_city的点击事件中先判断当前城市是否定位到,定位到则判断有无数据,有数据则可以判断点击后不同的控件样式。

那么下面就可以运行一下了。


文末

  这篇文章比较的简洁,那么也到这里了,山高水长,后会有期~

源码地址:GoodWeather
欢迎 StarFork

下一篇:Android 天气APP(三十三)语音播报

Android 天气APP(三十二)快捷切换常用城市相关推荐

  1. Android 天气APP(十二)空气质量、UI优化调整

    上一篇:Android 天气APP(十一)未来七天的天气预报.逐小时预报.UI优化 空气质量数据.UI优化 新版------------------- 一.自定义View 二.修改XML布局 三.添加 ...

  2. Android 天气APP(十四)修复UI显示异常、优化业务代码逻辑、增加详情天气显示

    上一篇:Android 天气APP(十三)仿微信弹窗(右上角加号点击弹窗效果).自定义背景图片.UI优化调整 添加管理城市 新版------------------- 一.添加管理城市页面 二.沉浸式 ...

  3. Android 天气APP(十五)增加城市搜索、历史搜索记录

    上一篇:Android 天气APP(十四)修复UI显示异常.优化业务代码逻辑.增加详情天气显示 添加城市 新版------------------- 一.推荐城市数据 二.推荐城市item布局和适配器 ...

  4. Android 天气APP(十八)常用城市

    上一篇:Android 天气APP(十七)热门城市 - 国内城市 完成此篇文章实现的效果图如下: 前言 常用城市对于那些经常在外面出差的朋友来说相信是不陌生的,因为涉及到在不同城市之间居住,所以对于其 ...

  5. JavaScript学习(三十二)— Keycode常用键位码对照表

    JavaScript学习(三十二)- Keycode常用键位码对照表 (一).字母和数字键的键码值(keyCode) (二).控制键键码值(keyCode) (三).多媒体键码值(keyCode)

  6. Android 天气APP(十)继续优化、下拉刷新页面天气数据

    上一篇:Android 天气APP(九)细节优化.必应每日一图 修复每日一图,增加下拉刷新,滑动改变标题 新版------------------- 一.修复每日请求必应壁纸Bug 二.增加下拉刷新 ...

  7. Unity3D研究院之在Unity中打开第三方数据库配合Android开发(三十二)

    http://www.xuanyusong.com/archives/831 http://www.xuanyusong.com/archives/1454 如果大家对Unity中如何使用数据库还不是 ...

  8. Android开发(三十二)——延时

    模拟延时 private class GetDataTask extends AsyncTask<Void, Void, String[]> {@Overrideprotected Str ...

  9. Android OpenCV(三十二):霍夫直线检测

    霍夫变换利用点与线之间的对偶性,将图像空间中直线上离散的像素点通过参数方程映射为霍夫空间中的曲线,并将霍夫空间中多条曲线的交点作为直线方程的参数映射为图像空间中的直线.给定直线的参数方程,可以利用霍夫 ...

最新文章

  1. 每日一皮:后来…后来…他得到了永生...
  2. C#获取枚举描述代码
  3. AtCoder AGC035E Develop (DP、图论、计数)
  4. 关于font-size对垂直居中影响的问题
  5. [译]模型-视图-提供器 模式
  6. IBM Watson物联网平台的两个MQTT工具
  7. pads layout 中 hatch和flood之区别
  8. wallpaper怎么设置锁屏_Apple ID密码忘了怎么找回?丨如何让面容和指纹解锁立马失效?...
  9. 课时39.细线表格(理解)
  10. 华为交换机关闭Telnet、开启SSH服务命令
  11. Spring IOC容器和获取组件对象源码分析
  12. python的with as语句_python with (as)语句
  13. OpenCV-Python实战(12)——一文详解AR增强现实
  14. 四、处理表单数据 (基础教程4)
  15. Java主类结构:变量与常量
  16. YUV420 总结 (YU12、YV12、NV12 和 NV21)
  17. 在MATLAB下安装Matpower模块
  18. 关于transmission下载速度提升的小建议
  19. elas算法源码赏析(一):PGM格式图片的读取和保存
  20. 按头安利 好看又实用的手绘图标素材看这里

热门文章

  1. html 在div 底部显示不出来,html 设置页脚div一直在页面底部
  2. 3.6 高速缓冲存储器
  3. 速卖通如何增加访客量?
  4. 如何理解进程结构体中的mm和active_mm?
  5. android studio连接小米手机mi 5s plus真机调试连接不上
  6. 解除自己微信绑定的小程序公众号开发者
  7. uva11121- -2进制
  8. 11121 Base -2
  9. android 详解画图,Android入门之画图详解
  10. AIOT:AI如何与IOT结合