一个App完成入门篇(五)- 完成新闻页面
本节教程将介绍如何用DeviceOne简单而高效的完成一个新闻页面。
- 导入项目
- 数据模板分离MVVM模型
- 自定义事件
- 展示新闻
- 九宫格展示
将要学习的demo效果图如下所示
1. 导入完整项目
本节示例demo请参考下载地址,可以导入到设计器中学习。
为了方便大家理解页面结构,请参考下图
图中红框所示的上面部分是SegmentView组件,和下面的BottomBar共同组成页面公共部分,而蓝框中是一个SlideView组件,可以左右滑动切换页面且跟SegmentView联动,页面个数则是取决于数据条数,如数据有四条就有四个页面;绿框所示是ListView组件,在本教程中是SlideView的模板,而ListView又可以绑定不同模板来展现不同页面;而黄框所示是跟上节教程中相同的直接引用一个UI页面。总而言之,这里的页面层级关系是SlideView的模板中嵌套了一个ListView,而ListView的模板又是其他不同页面。
2. 数据模板分离DeviceOne的数据绑定是采用了MVVM模式的,实现了页面和数据分离,数据通过绑定在不同模板上控制了页面的显示。DeviceOne提供了两个数据绑定组件,都是MM类型组件,一个是ListData,它本质上是一个可变数组(支持JSON array),可以增删改查数据;另外一个是HashData,它本质上是一个可变key-value键值对,也可以增删改查。
这里我们给SegmentView定义一个数据源jsonTabs,
再把这个数据源赋值给数据绑定组件ListData,定义SegmentView的数据模型module。
因为数据绑定组件可以绑定不同的数据源,而一个数据源只能被一个数据绑定组件绑定,是一对多的关系,所以当我们想把相同的数据源作为SlideView的数据模型module时需要复制一份数据源。
定义好数据模型module,我们再来定义ViewModel也就是模板视图。先给SegmentView定义一个模板视图UI页面newsTypeTabTemplate.ui,修改根ALayout的id为do_ALayout_root,里面拖拽一个Label,修改id为do_Label_title,调整Label的位置和大小。
然后我们在newsTypeTabTemplate.ui.js里把Label的text和tag属性通过UI组件通用的setMapping方法跟数据模型module联系起来,定义映射关系,这样ViewModule模板视图就完成了。(其中name和selected是jsonTabs数据源中的key)
现在只需要修改SegmentView的template属性,将属性值指向我们刚刚定义的newsTypeTabTemplate.ui的url,View和ViewModule就联系起来了。
最后我们要将数据模型module和它们都建立起联系,只需要用SegmentView添加绑定了数据模型module的ListData组件即可。
更多关于数据绑定的介绍,详见数据绑定
3. 自定义事件
为了让更真实的模拟新闻类App的使用习惯,我们处理一下选择不同的SegmentView时底下的SlideView页面也跟着切换的效果,即让SegmentView和SlideView联动起来。这个步骤非常简单,只需要在SegmentView的indexChanged事件中将当前SegmentView所处cell的index赋值给SlideView的cell,即可完成。
我们想要在SlideView切换不同的cell的同时页面数据也跟着切换,这就需要在SlideView的indexChanged事件里做大量操作,为了优化代码结构,这里就将切换数据的操作全部放在自定义事件selectOneTab中完成,只在触发indexChanged事件的回调中同时触发该自定义事件,这样我们在订阅selectOneTab事件时所作代码也都会被执行了。
订阅selectOneTab事件,在其中做更新数据的操作
需要特殊注意的是,自定义事件的订阅和触发可以不在同一个页面的脚本环境中完成,只需要保证自定义事件的触发在订阅之后即可。
更多关于自定义事件的使用,详见自定义事件。
这里为了更好的体验效果,让SlideView能无限滑动并且加载速度更快,只需要简单的设置两个属性即可。其一就是将SlideView的looping属性设置为true,实现无限滑动;其二就是设置isAllCache属性为true,在浏览上一页时预缓存下个页面。
4. 展示新闻
新闻展示页面的数据是通过Http组件请求的后台数据,在手势向下pull或向上push滑动页面时刷新请求,接下来详细说下这个步骤如何实现。
展示新闻
用上面同样的方法,我们先处理一下SlideView的数据和模板,不同的是这里SlideView的模板里嵌套了一个ListView组件,所以我们先处理ListView组件。ListView的数据是从后台通过http请求获取的,所以在添加了ListView的页面newsIndexSlideTemplate.ui对应的newsIndexSlideTemplate.ui.js脚本环境中去请求数据,并在Http的请求成功事件中将数据绑定给一个ListData组件,再让ListView去绑定该数据,同时复位pull或push出来的头部。(需要注意的是,这里直接将请求到的数据绑定给ListView组件,所以需要前后台沟通好数据格式,在后台保存时也是用JSON Array。)
因为ListView是支持多模版的,这里我们给ListView组件绑定两个模板,一个用于展示新闻列表newsRowTemplate0.ui,一个用于展示轮播图片newsRowTemplate1.ui。这两个模板也同样在模板页的根节点上调用setMapping方法定义好数据映射关系,这样数据与模板就结合起来了,在ListView上就能显示我们从后台请求到的数据了。
这里提一个小的处理,因为我们不确定要展示的数据到底有多少个字节,全部展示要占用多大的空间,所以我们设置ListView的模板页中要展示数据的Label的高度为-1,表示自动高度,并且将maxLines属性设置为2,表示最多只显示两行,这样就能控制每个cell显示数据的空间都是固定高度的,数据能整齐排列。
另外一个小处理就是让图片显示的速度更快,因为所有图片都是网络图片,显示之前都会先去请求,这样在网络环境不稳定时可能会导致图片显示框先出现默认图片(设置defaultImage)再显示真正要显示的图片。这里只需要简单的设置ImageView的cacheType为temporary,表示第一次加载图片时就缓存到本地,以后每次打开这个ImageView都会先读缓存的本地图片,然后再读服务器的网络图片,这样就能优化ImageView的加载速度,从而提高体验。
刷新新闻
想要在ListView页面上向下pull和向上push操作中获取新的数据并重新显示在模板中,首先要设置ListView的isFooterVisible和isHeaderVisible属性为true,这样上下拉的时候使头部和尾部可见,再分别在ListView的pull和push事件中去重新请求数据,并且在http请求的success事件中调用ListView的rebound方法让头部或尾部复位。
5. 九宫格展示
最后,我们说一下第三张效果图中点击“+”号会弹出一个快速选择新闻类型的UI界面如何实现。
首先画出需要弹出的UI页面newsTypeGrids.ui,也如之前教程中处理弹出Picker页面一样,在该页面中只放一个GridView组件,其他地方设置成灰色半透明效果。再设置GridView的模板页newsTypeGridTemplate.ui,同样定义好数据映射,将之前给SegmentView定义的数据源也复制一份让GridView绑定上,最后只需要在“+”号的touch事件中让newsTypeGrids.ui显示出来即可。
一个App完成入门篇(五)- 完成新闻页面的更多相关文章
- 一个App完成入门篇(七)- 完成发现页面
第七章是入门篇的倒数第二篇文章了,明天整个APP将进入收官. 本节教程主要要教会大家使用二维码扫描和用do_WebView组件加在html页面. 导入项目 do_WebView组件 扫描功能 自定义事 ...
- 一个App完成入门篇(六)- 完成通讯录页面
第五章和第六章间隔时间有点长,对不起大家了.下面继续. 本节教程将要教会大家如何加载本地通讯录. 导入项目 导入通讯录 自定义js模块 发送和订阅page消息 将要学习的demo效果图如下所示 1. ...
- 一个App完成入门篇(三)-完善主框架
本节教程将继续带领大家完善教学demo 导入项目 完善主框架 完成viewShower子视图 打开新页 启动动画 将要学习的demo效果图如下所示 1. 如何导入完整项目 本节示例demo请参考下载地 ...
- 一个App完成入门篇-终结篇(八)- 应用收官
经过以上几步的学习,我们终于来到最后一个步骤了,应用APP也接近尾声. 通过之前的几节教程,不知道您对使用DeviceOne开发一个应用是不是已经得心应手了,本节教程将教会大家如何在开发完成之后通过D ...
- 一个App完成入门篇(二)-搭建主框架
通过第一课的学习,你已经掌握了如何通过debug调试器来跟PC上的设计器联调来实时查看UI设计效果.调试代码了,接下来通过一系列的demo开发教学你将很快上手学习到如何开发一个真正的App. 要开发A ...
- 一个App完成入门篇(一)-从Hello world开始
程序员学习新技术都是通过Hello World开始的,我们也不例外.第一课我们简单了解利用do平台开发App的基本流程,能了解到的知识点是: 开发环境搭建 创建开发者账号 新建项目 拖拽一个组件 修改 ...
- 一个App完成入门篇(四)- 完成反馈页面
上一节中我们学会了如何通过点击不同按钮切换页面,这节专注于完成反馈页面的功能以及细节动画. 导入项目 添加新组件 同步新组件 完成页面布局 输入时加动画效果 弹出日期选择 直接引用UI页面 将要学习的 ...
- 【SSRS】入门篇(五) -- 设置报表格式
原文:[SSRS]入门篇(五) -- 设置报表格式 在上一节 [SSRS]入门篇(四) -- 向报表添加数据 我们设置好了报表,并可以预览到数据,如下图: 当报表完成后,有个重要的工作就是美化报表格式 ...
- 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序
如何在Visual Studio 2017中使用C# 7+语法 前言 之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法,然后闲来无事,搞着,搞着没搞出来,然后就写了这篇博文,不 ...
随机推荐
- proc文件系统
在shell终端里不带任何参数,直接运行mount命令可以显示正在挂载的文件系统.其中有这么一行 none on /proc type proc (rw) 这就是/proc文件系统.第一个域显示non ...
- .Net中的加密解密
返回博客列表 转 .Net中的加密解密 李朝强 发布时间: 2015/11/23 12:55 阅读: 33 收藏: 3 点赞: 0 评论: 0 在一些比较重要的应用场景中,通过网络传递数据需要进行加密 ...
- 数字与字母 随机数小demo
public String generateRandomId(){ String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHI ...
- 利用chrome的profiler查找js的memory leak
1. 首先要固定一个测试环境.具体来说,选择某一个可以重复的操作,作为标准的测试动作. 2. 刷新浏览器后用profiler抓下heap snapshot. 3. 进行操作,再一次抓下snapshot ...
- Win7上的ASP.NET MVC3项目在Win10上运行的一个坑
先解释一下问题:我原来的电脑环境是Win7+VS2015,因为新换了个电脑环境变成Win10+VS2015了,所以就把原先的项目复制到新的机器上,那么问题来了,原先的一个项目在VS2015上打开竟然直 ...
- jquery easyui的treegrid的控制
其中列的formatter很有作用,可以得到你想要的任何内容: 例: <table class="easyui-treegrid" id="tg" dat ...
- Javascript重要知识点梳理
Javascript重要知识点梳理 一.Javascript流程控制 js中常用的数据类型 var关键字的使用 if – else if – else switch while for 二.Javas ...
- NOIP2014 总结
想了很久,才开始动笔. 怎么说,感觉挺对不起自己的.愚蠢的失误让我正好卡着一等线,真希望不要是二等奖. 最难过的是,努力全葬送在愚蠢上面了. 不过也好,学会平静自己也是一种能力. 半期考试也遭的一塌糊 ...
- 1500. Prime Gap 11 月 11日
/*本篇为转载,在此申明,具体就是先设定从2以后所有的数都为质数,定为质数的数的倍数则不是质数,慢慢排除后面的数*/ #include<iostream>#include<cstri ...
- flask_关注者,联系人和好友
在这节我们实现的功能比较复杂,就是实现用户"关注"和"取消关注"的功能. 一个用户可以关注多个其他的用户,一个用户也可以被其他多个用户所关注,这样看的话,在数据 ...