模块6:绑定天气数据(1)

模块5中我们在主页面MainActivity中创建了获取天气数据的的异步任务。执行之后拿到了5个规定的城市的天气数据并在日志中进行了显示。但是,天气数据实际上是内嵌到ViewPager中的每一个Fragment中的,即Fragment和某城市的天气数据一一对应。因此,我们进行以下改造,使WeatherFragment类能够支持天气数据的传递和更新:

  • 修改工厂方法newInstance()使其接受天气对象作为参数
  • 将天气对象的数据绑定到Fragment的用户界面视图中

修改WeatherFragment.newInstance()方法

目前的这个用来创建Fragment对象的工厂方法是为测试而设计的。它接受一个int型参数,并设置给属性mPosition以表示当前Fragment对象在ViewPager中的位置:

现在进行改造,去掉属性mPosition,增加天气对象属性成员mWeather

然后将newInstance()方法的参数亦定义为天气类型,并修改方法的内部代码,将传入的天气对象指定给mWeather属性,并刷新UI各元素的数据。由于涉及多步操作,我们定义私有方法updateWeather()来完成之:


增加各UI元素对应之属性对象

在绑定天气数据到UI视图之前,我们需要照例从布局中获得相关的各UI组件对象,其中包括:

  • 当前温度
  • 最高和最低气温
  • 当前天气状况图标和文字描述
  • 数据更新时间
  • 天气状况背景大图

定义各自的成员对象:

并在onCreateView()方法中获取布局中的对应实例:


导入天气状况图标

图标资源直接提供给大家:

天气图标

图标都是透明背景的png格式图片文件。其中各个图标的命名方式都是“ic_w” + 天气状况代码 + “.png”的模式。这个天气状况代码包含在我们获取到的天气数据之中。我们可以根据这种固定模式来拼接我们需要的图标资源名称。

res文件夹下创建名为“raw”的文件夹,意味着此文件夹下的图片遵循原有格式和尺寸。将所有图标文件拷贝到此:


监视Activity状态

Activity作为应用程序的一个组件,需要先由系统创建实例,然后才能执行围绕它的相关处理。如果不创建即调用,则应用程序将会崩溃。因此,我们需要准确获知其是否确实已经创建。
在Fragment内部,当其所属的Activity创建完成时,其生命周期方法onActivityCreated()将被调用。可以这样理解:系统通过这个方法来通知我们Activity已经创建完成。我们只需要定义一个boolean类型的成员来表示这个状态,然后在onActivityCreated()方法中将其值置为true即可。而在编写相关代码时预先检查这个状态即可。

先定义状态成员变量isActivityCreated

加入生命周期方法onActivityCreated(),并在这里将isActivityCreated()设置为true


向用户界面填充数据

定义私有函数fillData()来专门执行向UI填充数据的操作:

fillData()方法编写代码。

1. 获取上下文对象

2. 设置几个气温值

3. 天气图标和文字描述以及数据更新时间

还剩下天气背景大图,由于相对复杂,我们用单独的章节来进行讲解。

现在fillData()方法完成,有两个地方需要调用它。一个是onActivityCreated()方法:

然后是updateWeather()方法,添加代码如下:


与MainActivity对接

1. 删除测试代码

此时切换到MainActivity类,由于WeatherFragment已经经过改造,原来调用处已经提示语法错误:

工厂方法定义已发生变化

由于当初添加这个fillTestInstances()方法的目的是用来测试,此时已经无用,所以直接将其删除。同时,对此方法的调用也一并去掉。可以跟随语法错误的提示追踪相关的代码位置。如果考虑以后尚有可能用到,亦可保留相关代码而将其注释掉:

2. 修改异步任务RequestWeatherTask

回顾一下,在MainActivity类中,我们通过列表数据结构来存储ViewPager中需要展示的Fragment:

    private List<WeatherFragment> mFragments = new ArrayList<>();

然后我们通过异步任务RequestWeatherTask从网络上取得了几个城市的天气信息并返回。

自然而然的,接下来就应当根据返回来的一组天气对象来生成新的Fragment并加入到列表结构中。我们通过修改RequestWeatherTask类的onPostExecute()方法来实现。
目前此方法仅仅记录了日志:

首先将Fragment列表清空:

然后在循环中,依次生成新的Fragment并加入列表中:

最后,非常重要的一步——通知ViewPager更新数据:

运行程序查看效果:

可以看到,不同页面展示了不同天气数据。但是还剩下几个问题:

  • 表示当前页面地理位置的标题文字没有随着页面的改变而刷新
  • 展示天气状况的页面背景大图没有随着天气情况的不同而改变

接下来的章节我们逐一将其实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容