基于Android开发的天气预报app(源码下载)

2 篇文章 7 订阅
订阅专栏

基于AndroidStudio环境开发的天气app

由于需要源码的人特别多,我特地花时间新增了对最新IDE版本Android Studio Chipmunk | 2021.2.1 Patch 1的支持,并开源了源码,需要的自取。

  • 源码地址:https://github.com/LuoPeiQin/DongWeather
  • 发现很多人有了源码地址,还是在下面留言要源码,应该是新手不会下载和打开GitHub的源码,所以特地写了一篇 下载并打开源码教程的文章,帮助大家下载源码并打开和运行
  • 如果觉得对你有帮助,麻烦帮忙点个赞,谢谢!

主要实现了:
1、定位城市天气显示;
2、城市编辑功能(增、删、改、查)以及对应天气显示信息的改变;
3、天气信息的Widget窗口显示(城市的编辑功能可以远程的更新Widget窗口信息的显示)
4、下拉刷新、天气显示界面左右滑动、城市拖拽等小模块

文章目录

  • 基于AndroidStudio环境开发的天气app
  • 一、 开发需求分析
    • 1、开发环境搭建 - AndroidStudio
    • 2、城市信息获取的api
    • 3、天气信息获取的api
    • 4、定位信息获取的api
  • 二、 系统设计分析
    • 1、天气信息界面显示设计
    • 2、已选择城市信息界面显示设计
    • 这里主要是有点击编辑前后的区别
    • 3、添加城市信息界面显示设计
    • 4、Widget设计
    • 5、界面转换设计
    • 6、系统总体和局部流程设计(流程图)
  • 三、 系统功能模块实现(代码部分)
    • 项目总体流程思路
    • 1、获取城市信息
    • 2、获取天气信息
    • 3、天气信息的显示
      • 获取背景图片和图片的更新
      • 天气显示信息左右活动切换已选择要显示的城市(ViewPager)
      • 下拉刷新功能
      • 通过点击右上角的编辑按钮进入城市管理功能
      • 导航组件功能
      • 小时天气小时超出屏幕宽度时的当前页面左右滑动(RecycleListView)
      • 布局圆角功能
    • 4、城市信息的显示

一、 开发需求分析

1、开发环境搭建 - AndroidStudio

安装步骤:
(1)下载。建议在官网下载,因为国内很多映射文件多少都是有点年代的,还是下载最新的比较好,也免去更新的麻烦。不过国内由于网络限制,上Android官网需要翻墙。AndroidStudio下载地址:https://developer.android.google.cn/studio/index.html里面是最新版本的AndroidStudio。
(2)安装,下载完成之后没有特别要求的话默认选择一直next就好了,一般的话只需要改下安装路径,避免C盘空间不够。因为AndroidStudio自带了JDK和Android SDK,所以Android完成后就可以直接进行开发了。

2、城市信息获取的api

城市信息这里我直接使用的是Android前辈搭建的一个服务器获取的,数据链接是http://guolin.tech/api/china,访问返回的是JSON数据类型的省份信息(JSON数据类型的解析后面会再详细说明),需要返回城市时只需要在本链接后加上“/对应省份id”即可获取到相应的城市信息,县市信息也是一样的,原链接加上“/对应省份id/对应城市id”即可。
这里其实也可以从其它天气服务商提供的api接口获取城市信息。

3、天气信息获取的api

天气信息的获取我使用的是 和风天气提供的免费的api,和风天气每天有提供4000次免费的基础天气查询,用来做开发测试是足够用的了。而且和风天气api接口返回的JSON数据类型也比较简单,作为Android初学者做项目是比较好的。想使用该接口只需要简单注册一个账号就可以了(对返回数据的处理我后面再详细说明)。老手的话可以在网上搜索别的服务商提供的免费接口,现在网上的免费接口少了很多,不过有还是有的。

4、定位信息获取的api

我这里使用的是百度提供的免费api接口http://lbsyun.baidu.com/apiconsole/key,因为Android原生定位API在国产手机中一般被阉割了,或者国内网络限制的原因,使用Android原生定位API一般是很难获取到定位信息的,跟手机厂商和网络环境都有关系。所以这边为了避免这种情况的不确定因素,我选择了使用百度提供的免费地位接口,在国内,百度和高德定位服务做得都还是不错的。使用百度定位api接口同样需要注册一个百度开发者账号,因为这不是本篇文章的重点。这边具体的操作就不再说明了。

二、 系统设计分析

1、天气信息界面显示设计

首先先上效果图:
天气主界面图

接下来我介绍一下天气显示信息中用到的一些设计:
首先是功能实现上的:
1)首先背景图片是每天会更新的,是从必应网上获取到的背景图片。
2)下拉刷新功能。
3)天气显示信息左右活动切换已选择要显示的城市。
4)通过点击右上角的编辑按钮进入城市管理功能。
5)导航组件功能。
6)小时天气小时超出屏幕宽度时的当前页面左右滑动。

其次是具体显示上的(分为一个城市的天气信息一个页面,每个页面又有七个模块)我们从上往下分析:
1)最上部分是城市名的显示和编辑按钮。
2)然后是导航原点显示。
3)其次是当前温度,当天天气和当天最低最高温的显示。(1)(2)部分都是用户比较关心的问题,所以我们放在最前面。
4)接下来是将来的小时预告,由于和风天气返回的数据只有当天每三小时的天气预告,所以这边的显示实现得比较差,不过我这里做的是兼容可以扩展的,不管数据多少都可以显示。如果将来需要更改数据源,这里的操作将非常简单 。
5)接着显示的是接下来几天的天气的大体介绍,这里显示的数据同样受限于获取到的数据。
6)再接着是一些生活指数的显示,由于我艺术细胞不太好,所以这里的图片显示有点丑。。你们可以根据自己的喜好去更改图片。
7)最后就是一些生活建议的显示了。

2、已选择城市信息界面显示设计

先上图吧
城市编辑显示1
城市编辑显示2

这里主要是有点击编辑前后的区别

下面我们来一一说明:
点击编辑前
布局主要分成三个部分:
1、最上方的:
*左侧返回按钮,回到天气显示界面
*中间固定的“城市管理”四个字
*右侧的编辑按钮,点击之后就可以对城市进行增、删、和更改位置了
2、中间部分:
*中间部分是已选择城市信息的显示
3、最下方部分:
*最下面是一个添加城市的按钮,点击之后进入城市添加功能

点击编辑后
1、最上方的:
*左侧取消按钮,即放弃本次编辑后的结果,回到非编辑界面
*中间固定的“城市管理”四个字
*右侧的保存按钮,即保存本次编辑的结果并回到非编辑界面
2、中间部分:
*中间部分是已选择城市信息的显示,与编辑前不同的是增加了左侧拖动改变顺序的按钮和右侧的删除城市按钮
3、最下方部分:
*最下面是一个添加城市的按钮,点击之后进入城市添加功能

所用到的功能点
1、dragListView:可拖拽的listview
2、Android自带数据库
3、重叠按钮的实现
以上功能模块下面我都会一一说明

3、添加城市信息界面显示设计

先上图:
添加城市显示图1
添加城市显示图2

说明
这里的实现比较简单,就是使用ListView去显示省、市、县三个级别的城市,根据选择的城市去网络或者本地加载数据,然后显示。

4、Widget设计

同样先上图
widget显示设计

说明
这里的实现显示上比较简单,但是功能逻辑和实现上相对复杂。

显示上的设计
1、背景图片:widget的背景图片同样是网络上下载并且每天会自动更换的,不同的是为了保证用户滑动界面时的流畅性,这里做了图片缩放处理之后再显示。
2、中间固定文字“当前天气”
3、下面是一个ListView用来显示简略的已选择城市的信息

功能上的设计
1、服务listView改变的server进程
2、contentProvider提供跨进程间的数据通信
3、图片下载的异步线程和图片缩放实现
4、异步线程与UI线程通过handler实现通信

5、界面转换设计

有界面转换实现的:
1、点开app进入到城市天气信息显示界面
2、点击编辑按钮进入到城市管理界面
3、城市管理界面中点击添加按钮进入到城市添加界面
4、城市管理界面中点击返回按钮回到城市天气信息显示界面
5、添加城市界面中添加完成或者点击返回按钮回到城市天气信息显示界面

6、系统总体和局部流程设计(流程图)

这里写图片描述

由于时间原因,这边就先绘制一个流程图了,别的流程图等后面有时间了再绘制

三、 系统功能模块实现(代码部分)

前面介绍了那么多,现在终于到了重点了,前面讲述的功能我在这里都将为大家一一说明。
首先给大家看一下工程目录的截图:
工程目录图

项目总体流程思路

接下来我根据项目的实现过程来给大家介绍整个项目的总体流程

1、天气app最重要的是获取城市列表和天气信息,所以首先要解决的问题是在网络上找到合适的api接口,并根据服务商提供的数据转换成自己需要显示的数据。
2、有了需要的显示信息之后,我们需要自己去设计怎么显示,怎么让用户去有一个好的体验。我的设计是在使用三个Activity去和用户交互,参照我的项目截图,其中WeatherActivity作为启动活动,用于显示天气信息,提供的是多页带导航栏可左右滑动的效果。ChooseAreaActivity是管理城市的活动,用于添加、删除、改变要显示天气信息的城市列表。AddCountyActivity是用于添加城市的活动。
3、实现了这些基本的城市管理和天气显示之后,接下来就是进阶功能了,首先我们实现百度定位功能,根据定位结果加载当前城市天气。
4、实现widget功能。

这个项目总体的思路就是这样的,接下来我们一步一步的去说明

#城市和天气信息获取模块

1、获取城市信息

数据链接http://guolin.tech/api/china,访问返回的是JSON数据类型的省份信息,需要返回城市时只需要在本链接后加上“/对应省份id”即可获取到相应的城市信息,县市信息也是一样的,原链接加上“/对应省份id/对应城市id”即可。
大家点击网址可以得到这样的响应:
这里写图片描述
这里得到的是一个JSON数据,以下是对它的解析代码:

JSONArray jsonArray = new JSONArray(response);
                for (int i = 0; i < jsonArray.length(); ++i) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    Province province = new Province();
                    province.setProvinceCode(jsonObject.getInt("id"));
                    province.setProvinceName(jsonObject.getString("name"));
                    province.save();
                }
        这里的后几行代码是我使用LItepal存储数据到数据库的操作,response变量就是访问网址得到的原JSON数据。
        网上关于JSON的解析方法很多,这边不再说得过多。
        这边还需要说明的是怎么去网上获取JSON数据。
        首先要说明的是网络操作是不能在UI线程里进行的,否则会程序崩溃。所以这里必须用的异步线程去处理网络加载的问题,并且在加载线程事使用一个进度条来给予用户交互。
        以下是网络加载的代码:
        ```java
        public static void sendRequestOkHttpForGet(final String adress,final MyCallBack myCallBack) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                try {
                    URL url = new URL(adress);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    InputStream in = connection.getInputStream();
                    String response = convertStreamToString(in);
                    //回调接口函数,让主线程处理
                    //成功
                    myCallBack.onResponse(response);
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    //失败
                    myCallBack.onFailure(e);
                } catch (ProtocolException e) {
                    e.printStackTrace();
                    myCallBack.onFailure(e);
                } catch (IOException e) {
                    e.printStackTrace();
                    myCallBack.onFailure(e);
                } finally {
                    if (null != connection) {
                        connection.disconnect();
                    }
                }
            }
        }).start();
   其中第一个参数是要访问的网络的地址,第二个参数是一个回调接口。
        public interface MyCallBack {

        void onFailure(IOException e);

        void onResponse(String response) throws IOException;
}

	第一个参数没有什么好说的(就是我们刚刚使用的 ),第二个参数是异步线程经常会用到的一个和主线程交互的手段。在调用函数时传入一个回调接口的指针,当异步线程完成相应的耗时操作之后,再使用该指针调用回调函数即可实现异步线程与主线程的交互了。
	城市列表的信息的获取到这里就算结束了。

2、获取天气信息

获取天气信息的网络操作是和获取城市信息的操作是一样的,使用上面那个网络异步函数即可,如果觉得不好,也可以使用网络开源项目包装的网络访问接口,比如说OKHttp。不同的是天气信息的JSON数据要比城市信息的JSON数据复杂得多。
这里提供连接给大家感受一下 深圳天气
这里写图片描述
这里是用Chrome的JSON-handle解析之后的结果。可以看到还是比较复杂的。所以这里我们采用GSON方式来解析JSON,方便我们后面对数据的操作。
GSON方式是把JSON数据解析成相应的对象的一种方式,主要步骤如下:
1、根据JSON数据建立不同的类,JSON数据的每一个结点对应一个类,并且根据不同的结点的复杂程度选择是否还要使用内部类。
2、@SerializedName(“JSON中的结点名”)需要转换成的节点名;
使用关键字把一些JSON数据中意义晦涩的名词转换成类中名字可以见名知意的属性。
3、JSON数据转换成对象实例

JSONObject jsonObject = new JSONObject(response);
                JSONArray jsonArray = jsonObject.getJSONArray("HeWeather5");
                String weateherContent = jsonArray.getJSONObject(0).toString();
                return new Gson().fromJson(weateherContent, 类名.class);

最后,我们把得到的对象的数据对应的添加到要显示的活动的布局当中就可以了。

#城市和天气信息显示模块

3、天气信息的显示

这里相对麻烦一点,因为天气信息的显示中我们做了比较多的功能

获取背景图片和图片的更新

这里我使用的是必应主页提供的背景图片作为天气信息显示的背景图片http://guolin.tech/api/bing_pic这个链接是获取必应每日背景图片下载链接的,可以通过该链接获取图片下载地址,然后再去下载。
由于下载图片是耗时的网络操作,所以我们这里需要使用一个异步线程去下载图片,然后在下载好之后再通知UI线程去加载。
具体代码:

		public void updateBingPic() {
        String requestBingPic = "http://guolin.tech/api/bing_pic";
        OkHttp.sendRequestOkHttpForGet(requestBingPic, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String bingPic = response.body().string();
                SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(WeatherActivity.this).edit();
                editor.putString("bing_pic", bingPic);
                editor.apply();
            }
        });
    }

这个是获取图片下载地址的代码,变量bingPic的内容就是下载链接
if (bingPic != null) {
Glide.with(WeatherActivity.this).load(bingPic).into(bingPicIv);
}
当它不为空时,我们使用Glide去下载并加载图片到天气显示背景。Glide 是 Google 员工的开源项目, Google I/O 上被推荐使用Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。

天气显示信息左右活动切换已选择要显示的城市(ViewPager)

ViewPager是android扩展包v4包中的类,主要功能是实现view页面的左右切换。在本项目中,就是一个view包含一个城市的天气信息,然后view又加入到ViewPager中。
这里说一下ViewPager的使用步骤,ViewPager的实现与ListView有很多相似之处,主要步骤如下:
1、创建或设置数据源。
2、根据数据源创建或配置好相应的适配器。
3、在布局文件中加入ViewPager控件,并在程序给控件设置步骤2中的适配器。
4、给控件添加监听器。
PS:其实Android中很多包含多View的控件都是通过以上步骤实现的,很相似,只要我们认真的掌握了其中的一种,那么别的也就很容易去上手了。

下拉刷新功能

本项目中的下拉刷新功能是使用SwipeRefreshLayout控件实现的,实现的步骤很简单:
1、在布局文件中实现下拉刷新功能的地方添加android.support.v4.widget.SwipeRefreshLayout控件,这里推荐使用v4包,因为能够支持低版本的Android手机。
2、在程序中定义并设置相应属性(样式等等)和监听器。
3、设置事件的相应响应和启动下拉刷新和结束下拉刷新。

通过点击右上角的编辑按钮进入城市管理功能

这里的实现就很基础了,简单讲一下步骤:
1、在布局文件定义按钮
2、在程序中找到按钮并设置监听器
3、在响应事件中做进入城市功能活动的逻辑

导航组件功能

本项目的导航栏功能是用Selector实现,Selector主要是用来改变各种view控件的默认背景的。实现步骤如下:
1、xml文件定义
?xml version=“1.0” encoding=“utf-8” ?>
selector xmlns:android=“http://schemas.android.com/apk/res/android”>
!-- 默认时的背景图片–>
item android:drawable=“@drawable/pic1” />
!-- 没有焦点时的背景图片 -->
item android:state_window_focused=“false”
android:drawable=“@drawable/pic1” />
!-- 非触摸模式下获得焦点并单击时的背景图片 -->
item android:state_focused=“true” android:state_pressed=“true” android:drawable= “@drawable/pic2” />
!-- 触摸模式下单击时的背景图片–>
item android:state_focused=“false” android:state_pressed=“true” android:drawable=“@drawable/pic3” />
!–选中时的图片背景–>
item android:state_selected=“true” android:drawable=“@drawable/pic4” />
!–获得焦点时的图片背景–>
item android:state_focused=“true” android:drawable=“@drawable/pic5” />
/selector>

2、使用
LinearLayout layout = (LinearLayout)findViewById(R.id.vp_guide_layout);
LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(20, 20);
mParams.setMargins(0, 0, 0, 0);//设置小圆点左右之间的间隔

    guideShapeViewArrayList.clear();
    layout.removeAllViews();
    ImageView imageView = new ImageView(this);
    imageView.setLayoutParams(mParams);
    imageView.setImageResource(R.drawable.guide_shape_select);

小时天气小时超出屏幕宽度时的当前页面左右滑动(RecycleListView)

RecycleListView是Android官方出品的一个可以代替甚至超越ListView的东西。RecycleListView的实现比不优化的ListView麻烦一些,但是功能上比ListView要更强大,因为他的显示不仅可以竖屏,还可以横屏。
实现步骤:
1、准备数据源
2、根据数据源设置适配器
static class ViewHolder extends RecyclerView.ViewHolder {
TextView hourlyTimeTV;
ImageView hourlyWeatherImageV;
TextView hourlyTemperatureTV;

    public ViewHolder(View view){
        super(view);
        hourlyTimeTV = (TextView) view.findViewById(R.id.hourly_time_tv);
        hourlyWeatherImageV = (ImageView) view.findViewById(R.id.hourly_weather_iv);
        hourlyTemperatureTV = (TextView) view.findViewById(R.id.hourly_temperature_tv);
    }
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.hourly_forecast_item, parent, false);
    ViewHolder holder = new ViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    HourlyWeather hourlyWeather = hourlyWeatherList.get(position);
    holder.hourlyTimeTV.setText(hourlyWeather.hourlyTime + "时");
    holder.hourlyWeatherImageV.setImageBitmap(hourlyWeather.hourlyImageBit);
    holder.hourlyTemperatureTV.setText(hourlyWeather.hourlyTemperature + "º");
}

@Override
public int getItemCount() {
    return hourlyWeatherList.size();
}

要实现RecyclerView.Adapter主要是要实现三个函数
onCreateViewHolder()
onBindViewHolder()
getItemCount()

3、在布局文件定义RecycleView控件,并在代码中为控件设置以上适配器。
4、选择是否要设置监听器。

有没有发现和ListView,ViewPager的实现步骤很相似呢。

布局圆角功能

布局圆角主要是为了让布局中的控件看起来美观一些。
实现很简单
1、在drawable中定义xml文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#8000" />
    <corners
        <android:topLeftRadius="10dp"
        <android:topRightRadius="10dp"
        <android:bottomRightRadius="10dp"
        <android:bottomLeftRadius="10dp"/>
</shape>

2、在需要引入圆角的布局文件中引入本配置作为背景

android:background="@drawable/corners_bg"

4、城市信息的显示

这里相对麻烦一点,因为城市信息的显示中我们做了比较多的功能,下面线总体介绍项目使用到的功能模块,然后再一一说明:
1、活动切换按钮,这里就不再重复说明了。
2、添加城市。
3、可拖拽的ListView(DragListView)的城市信息实现
本模块我们主要讲解DragListview的实现:
这里写图片描述
这里实现的主要功能有:删除城市、城市排序切换。
实现步骤:
1、准备数据源
2、设置适配器

public class CountiesAdapter extends BaseAdapter {
        private Context context;
        //适配器的数据源 selectedCityList
        private List<SelectedCounty> items;

        public CountiesAdapter(Context context,List<SelectedCounty> selectedCityList){
            this.context = context;
            this.items = selectedCityList;
            LogUtil.d(TAG, "CountiesAdapter: selectedCityList size:" + selectedCityList.size());
            LogUtil.d(TAG, "CountiesAdapter: selectedCityList items size:" + items.size());
        }

        @Override
        public int getCount() {
            return items.size();
        }

        @Override
        public Object getItem(int arg0) {
            return items.get(arg0);
        }

        @Override
        public long getItemId(int arg0) {
            return arg0;
        }

        public void remove(int arg0) {//删除指定位置的item
            items.remove(arg0);
            this.notifyDataSetChanged();//不要忘记更改适配器对象的数据源
        }

        public void insert(SelectedCounty item, int arg0) {
            items.add(arg0, item);
            this.notifyDataSetChanged();
        }

        public void change(List<SelectedCounty> selectedCityList) {
            items = selectedCityList;
            this.notifyDataSetChanged();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            SelectedCounty item = (SelectedCounty)getItem(position);
            ViewHolder viewHolder;
            if(null == convertView){
                viewHolder = new ViewHolder();
                convertView = LayoutInflater.from(context).inflate(R.layout.drag_listview_item, null);
                viewHolder.dragMoveIv = (ImageView) convertView.findViewById(R.id.drag_move_iv);
                viewHolder.dragCountyNameTv = (TextView) convertView.findViewById(R.id.drag_county_name_tv);
                viewHolder.drag_click_remove = (ImageView) convertView.findViewById(R.id.drag_click_remove);
                moveImageViewList.add(viewHolder.dragMoveIv);
                deleteImageViewList.add(viewHolder.drag_click_remove);
                convertView.setTag(viewHolder);
            }else{
                viewHolder = (ViewHolder) convertView.getTag();
            }
            //是否点击了edit按钮,
            if (isEditClick) {
                if (!WeatherActivity.isLocationCountyRemove && null != WeatherActivity.locationCountyWeatherId && 0 == position ) {
                    viewHolder.drag_click_remove.setVisibility(View.GONE);
                } else {
                    viewHolder.dragMoveIv.setVisibility(View.VISIBLE);
                    viewHolder.drag_click_remove.setVisibility(View.VISIBLE);
                }
            }else {
                viewHolder.dragMoveIv.setVisibility(View.GONE);
                viewHolder.drag_click_remove.setVisibility(View.GONE);
            }
            viewHolder.dragCountyNameTv.setText(item.getCountyName());
            return convertView;
        }

        class ViewHolder {
            ImageView dragMoveIv;
            TextView dragCountyNameTv;
            ImageView drag_click_remove;
        }
    }

别的地方和ListView是一样的,不同的是多了一个remove和insert函数

public void remove(int arg0) {//删除指定位置的item
            items.remove(arg0);
            this.notifyDataSetChanged();//不要忘记更改适配器对象的数据源
        }

        public void insert(SelectedCounty item, int arg0) {
            items.add(arg0, item);
            this.notifyDataSetChanged();
        }

3、控件绑定适配器
这里也有区别:首先要定义两个函数:

//监听器在手机拖动停下的时候触发
    private DragSortListView.DropListener onDrop =
            new DragSortListView.DropListener() {
                @Override
                public void drop(int from, int to) {//from to 分别表示 被拖动控件原位置 和目标位置
                    //如果定位城市存在,则去除定位城市的操作
                    if (!WeatherActivity.isLocationCountyRemove && null != WeatherActivity.locationCountyWeatherId) {
                        if (0 == from || 0 == to) {
                            return;
                        }
                    }
                    if (from != to) {
                        SelectedCounty item = (SelectedCounty)countiesAdapter.getItem(from);//得到listview的适配器
                        countiesAdapter.remove(from);//在适配器中”原位置“的数据。
                        countiesAdapter.insert(item, to);//在目标位置中插入被拖动的控件。
                        isSwapCounty = true;
                    }
                }
            };
    //删除监听器,点击左边差号就触发。删除item操作。
    private DragSortListView.RemoveListener onRemove =
            new DragSortListView.RemoveListener() {
                @Override
                public void remove(int which) {
                    delCountyId.add(selectedCityList.get(which).getId());
                    delCountyIndex.add(which);
                    countiesAdapter.remove(which);
                    Log.d(TAG, "onClick: remove position:" + which);
                }
            };

然后绑定适配器时这两个函数也一起绑定

//水平滑动显示
        hourlyRecycler = (RecyclerView) currentView.findViewById(R.id.hourly_recycler);
        layoutManager = new LinearLayoutManager(currentView.getContext());
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        hourlyRecycler.setLayoutManager(layoutManager);
        hourlyWeatherAdapter = new HourlyWeatherAdapter(hourlyWeatherList);
        hourlyRecycler.setAdapter(hourlyWeatherAdapter);

有问题或要 者建议的可以在评论留言,需要源码的也可以留言,我看到了都会及时回复的。
未完待续。。。。。。


安卓期末大作业Android天气预报app源码.zip
06-21
安卓期末大作业Android天气预报app源码。纯手打高分项目。 安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码安卓期末大作业Android天气预报app源码
基于Android天气预报App源码毕业设计(高分项目).zip
04-28
基于Android天气预报App源码毕业设计(高分项目).zip1.该项目是个人毕设项目源码,评审分达到97分,都经过严格调试,确保可以运行!放心下载使用。本项目是以java为基础、android5.0平台开发的一款手机应用程序;本项目采用了XmlPullParser解析技术,解析XML数据文件;密码加密用到了MD5算法;密码密保存储用到了sharePreferences;报备信息,个人资料信息,视频播放记录信息用sqlite存储;地图用到了高德地图官方sdk各个机型的so库文件;轮播图用到了fragment;视频习题课程列表用到了自定义adapter;主界面等用到了普通view视图。使用到okhttp网络请求技术。 基于Android天气预报App源码毕业设计(高分项目).zip1.该项目是个人毕设项目源码,评审分达到97分,都经过严格调试,确保可以运行!放心下载使用。本项目是以java为基础、android5.0平台开发的一款手机应用程序;本项目采用了XmlPullParser解析技术,解析XML数据文件;密码加密用到了MD5算法;密码密保存储用到了sharePreferen
为你的程序精选的7个最佳天气API
最新发布
Explinks的博客
05-23 940
天气API对于开发人员来说是构建响应更快、安全性更高的应用程序的有力工具。使用天气API可以帮助开发者提供出色的用户体验,实现高效的数据管理。不仅对企业有帮助,也对客户有利。
基于android天气预报实现
02-18
基于android天气预报系统,用java语言实现,压缩包中包含完整项目并有完整的实验报告,是期末大作业必备良品。
基于Android的天气查询APP设计源码
04-11
源码提供了一个基于Android的天气查询APP设计。项目包含151个文件,其中包括73个PNG图片、28个JPG图片、25个XML文件、10个Java源文件、3个APK文件、2个TTF字体文件、2个JAR文件、1个Gitignore文件和1个LICENSE文件。这个APP是一个用于查询天气的安卓应用,用户可以查看当前天气状况和未来几天的天气预报,适合用于日常天气查询。
Android天气预报APP
12-17
Android实现的简单的天气预报APP,输入城市名称、城市拼音、城市代码均可以获取该城市三天内天气预报
免费可用的天气api接口及其他接口
海碗吃饭的博客
09-12 977
免费可用的天气api接口及其他接口
真正免费的天气API,无需注册申请key
weixin_67415700的博客
11-25 4705
无聊整理的真正免费的天气API,无需注册申请key等,当然部分数据解析需要自己理解下,也不是所有天气数据都有,如果有特别需求,还是使用各个收费的天气供应商支持。支持未来7天的数据查询,支持的数据有天气、温度、湿度、PM2.5、PM10、空气指数、空气质量、日出时间、日落时间等;第一个中华万年历的应该更稳定些,第二个是讯飞内置的语音查询天气API,不排除后续讯飞接口优化。3.支持一些天气指数提示和建议,包括穿衣指数,紫外线指数,运动指数等;2.支持前一天和未来五天的数据,包含高-低温,白天天气和夜晚天气;
Android Studio实现天气预报小程序
热门推荐
weixin_45467625的博客
07-14 1万+
Android-studio编写一个简单天气预报软件
java毕设安卓基于Android天气预报及推荐系统(开题+源码
qh604的博客
03-12 1306
因此,开发一款集天气预报、景点分类、景点信息于一体的综合系统,不仅能够满足用户的实际需求,还能提升用户体验,推动移动互联网服务的升级。此外,通过本研究的开展,还能够培养和提高研究团队在Android应用开发、数据处理和推荐算法等方面的技能水平,为未来的研究和实践奠定坚实的基础。同时,基于用户的兴趣和行为数据,设计有效的推荐算法,实现个性化的景点推荐。通过以上研究内容的开展,旨在开发一款功能完善、性能稳定的基于Android平台的天气预报及推荐系统,为用户提供高效、便捷的信息服务,推动旅游业的发展和创新。
(更新源码AndroidStudio新手开发:天气app(百度地图api+和风天气api+城市查询+折线展示)
qq_42679573的博客
06-25 1万+
AndroidStudio新手开发:天气app(百度地图api+和风天气api+城市查询+折线展示)1、内容简介 1、内容简介        学校b测,碰巧选到了app开发,之前只有一些网站开发经历,第一次接触安卓端,从配环境查攻略,到运行他人demo一步步理解与修改,到最后实现定位天气查询、折线图展示等功能,手机上安装了自己的app后顿时成就感十足,写下此文记录此次开发的要点与攻略,同时为其他新手开发者排一些bug。界面展示如下: ...
Android本科毕业设计基于Android天气预报APP系统源码.zip
05-27
Android本科毕业设计基于Android天气预报开发APP系统源码。显示城市当前的实时天气状况,包括城市名称、城市名片、天气情况、温度高低、星期等信息。界面左边有一列城市列表,显示中国各个城市名称,当用户想知道哪个城市的天气情况时,点击这个城市名就可以获取天气状况,显示城市名称,城市名片,温度和天气情况,同时对未来6天的天气情况简述,。Android本科毕业设计基于Android天气预报开发APP系统源码。显示城市当前的实时天气状况,包括城市名称、城市名片、天气情况、温度高低、星期等信息。界面左边有一列城市列表,显示中国各个城市名称,当用户想知道哪个城市的天气情况时,点击这个城市名就可以获取天气状况,显示城市名称,城市名片,温度和天气情况,同时对未来6天的天气情况简述Android本科毕业设计基于Android天气预报开发APP系统源码。显示城市当前的实时天气状况,包括城市名称、城市名片、天气情况、温度高低、星期等信息。界面左边有一列城市列表,显示中国各个城市名称,当用户想知道哪个城市的天气情况时,点击这个城市名就可以获取天气状况,显示城市名称,城市名片,温度和天气情况,
Android 中文天气预报程序.zip项目安卓应用源码下载
03-07
Android 中文天气预报程序.zip项目安卓应用源码下载Android 中文天气预报程序.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
安卓天气预报源码(带换肤功能)weatherApp.7z
03-20
1、资料包括安卓app源代码和产品设计说明相关文档,有助于理解整个app设计开发过程。 2、资源内容:安卓app框架源代码文档 3、使用/学习目标:了解移动开发核心原理 4、应用场景:安卓编程,项目产品化、资源处理等内容实现 5、特点:简化安卓移动开发代码实现过程 6、适用人群:想阅读安卓app源码的初学者 7、使用/学习说明:在学习的过程要结合安卓开发的核心原理与内容需求分析和方案设计,在实践中不断提升
基于Android开发天气预报app.zip
08-16
Android完整课程设计,包含Android源程序,apk文件,课程设计说明书,apk文件,Android源程序皆经过测设,导入android studio即可运行
基于Android系统实现的天气预报简单实例
06-11
天气预报是数据来源于移动的和天气,可以用于初学者的学习开发使用
一个基于Android studio开发的简易天气预报APP源码
01-11
一个基于Android studio开发的简易天气预报APP源码
基于Android天气预报应用系统设计与实现.zip
06-13
整个app实现了对天气预报的获取、展示,位置的获取等功能。通过安卓网络编程的方式可以很方便的获取到天气json数据,通过使用GSON库,解析为我们软件需要的数据结构,给软件的编写提供了极大的便利。安卓的Activity...
android开发之天气类app源码
05-21
本文将深入探讨基于Java编程语言的Android天气类App源码,旨在为开发者提供一个学习和参考的实例。 首先,Android天气类App的核心功能包括获取天气数据、展示天气信息以及更新数据。这些功能的实现离不开网络请求、...
生成一段Android 天气预报APP的代码
03-10
你好,以下是一段Android天气预报APP的代码: ``` public class MainActivity extends AppCompatActivity { private TextView mCityTextView; private TextView mWeatherTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCityTextView = findViewById(R.id.city_text_view); mWeatherTextView = findViewById(R.id.weather_text_view); String city = "北京"; String weather = "晴"; mCityTextView.setText(city); mWeatherTextView.setText(weather); } } ``` 以上代码仅供参考,具体实现还需要根据实际需求进行修改。希望对你有所帮助。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 基于Android开发的天气预报app(源码下载) 80763
  • 下载并打开Github源码教程 10641
  • 面试c++研发工程师需要看哪些书 4027
  • 推荐一个很好用的蓝牙开源库 3850
  • 为什么匿名内部类只能访问其所在方法中的final类型的局部变量? 455

分类专栏

  • 完整项目 2篇
  • Android基础 3篇
  • 完全搞懂HTTP
  • View 1篇
  • Activity 2篇
  • Android的IPC 1篇
  • Android消息机制 4篇

最新评论

  • 基于Android开发的天气预报app(源码下载)

    2201_75717138: 前辈,项目可以运行,但手机上获取城市数据失败,不知道是什么问题,前辈可以解答一下吗?谢谢

  • 基于Android开发的天气预报app(源码下载)

    孤孤老人: 作者大大已关注,想要源码2179613445@qq.com

  • 基于Android开发的天气预报app(源码下载)

    2401_83656504: 作者大大已关注,想要源码1715663760@qq.com

  • 基于Android开发的天气预报app(源码下载)

    2301_78742423: 作者大大已关注,想要源码2136328393@qq.com

  • 基于Android开发的天气预报app(源码下载)

    ☭☭☭: 作者大大已关注,想要源码965824010@qq.com

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 下载并打开Github源码教程
  • 推荐一个很好用的蓝牙开源库
  • 为什么匿名内部类只能访问其所在方法中的final类型的局部变量?
2020年3篇
2019年7篇
2018年2篇
2017年1篇
2016年1篇

目录

目录

评论 808
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码坪地网站推广坪山网站优化按天计费同乐优秀网站设计福永网站推广工具广州网站优化按天扣费松岗网站设计模板福永外贸网站设计荷坳SEO按天计费木棉湾网站搭建爱联阿里店铺运营坂田网站设计模板爱联百度seo布吉网络广告推广东莞SEO按天收费福田模板网站建设坪山高端网站设计龙华建站同乐网站建设大芬关键词按天收费福田关键词排名包年推广龙岗网站设计模板坪山标王龙华如何制作网站龙华seo网站优化光明网站推广系统石岩优化南澳网站定制龙岗网站开发南联网站开发坪地seo网站优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化