一个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显示出来即可。

转载于:https://www.cnblogs.com/wjiaonianhua/p/5353693.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员职业规划

每个程序员的职业生涯无非以下几种情况:一、帮别人挣钱(打工)不管你是刚入职的小兵,还是管人的经理,甚至是唬人的总监,都属于这一阶段。通常程序员在这一阶段的职业发展分两条线,专家&#xff0…

电脑处理器i5和i7的区别,如何选择?

对于好多正在准备入手笔记本的朋友们来说,电脑的配置参数真的是让人眼花缭乱,一些看不懂的数字和英文码看得人心烦,i5和i7的区别究竟在哪里那?处理器中央处理器(英文Central ProcessingUnit,CPU&#xff09…

c++ map的存储结构_「软帝学院」java集合类框架map及相关常见问题二

Map接口 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。 Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 Map中的…

Windows 下 Conda install 安装出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url解决措施

在使用Conda install 安装库的时候出现以下错误 原因是使用的是国外的镜像,切换至国内镜像就可以解决啦 在cmd 中输入下面命令 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes…

盘点谷歌浏览器9项隐藏的实用功能

谷歌 Chrome 浏览器一直以速度、简洁和安全为用户所熟知。除此之外,Chrome 的其他功能也非常强大,为了进一步提高工作效率,让我们一一揭晓它的那些隐藏技能吧。1、同时登入多个账户用户拥有多个谷歌账户(工作用或个人用&#xff0…

正则10-18

转载于:https://www.cnblogs.com/XACOOL/p/5357652.html

华为手机下拉菜单没了_用了三年才知道华为录屏这么强大!再不会用,手机钱打水漂了...

现在的手机录屏操作可不少,但是像华为手机这样好用的可不多了!用了好几年华为才知道,原来它的录屏操作这么逆天,今天我就来给大家科普科普:华为录屏的那些事儿!1、快捷录屏直播录屏讲究的就是新鲜热乎&…

程序员下班电脑不关机的5大原因,你中招了吗?

不管是周围的程序员朋友还是网上的很多程序员朋友,在下班后都是习惯不关电脑的,针对这一发现,小编收集了部分网友的意见,看看身为程序员的你是不是也是这样的呢?1、你知道:开机要打开十个左右的应用&#x…

mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同&#…

Anaconda详细安装及安装Scrapy框架

Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。 因为包含了大量的科学包,Anaconda 的下载文件比较大(约 531 MB),如果只需要某些包,或者需要节…

时下流行的9种恶意软件,你都了解吗?

来自:FreeBuf.COM*参考来源:csoonline,Karunesh91编译当今时代,网络世界处处充满了危机,对于网络用户来说,能够对各种类型的恶意软件进行了解,也许有助于在网上冲浪的过程中保全自身。病毒计算机…

SpringCloud和SprigBoot之间的依赖关系怎么看

SpringCloud官网地址 https://spring.io/projects/spring-cloud 不推荐使用了,推荐用最新的是Hoxton版本 打开下面提供的网页 https://start.spring.io/actuator/info 使用解析工具查看 https://tool.lu/json/ 查看json串返回的结果 { "git": { …

微软最强命令行工具 Windows Terminal,强势霸榜GitHub

命令提示符也是算 Windows 系统的一大特色了,相信很多人刚看到这白底黑字的界面都有点哭笑不得吧,好在后来微软陆续推出了Powershell、cmd之类的命令行工具,来提供一些更加高级的功能如今微软更进一步,放出一大招,正式…

修改Windows远程桌面3389端口

3389端口是Windows 2000(2003) Server 远程桌面的服务端口,可以通过这个端口,用“远程桌面”等连接工具来连接到远程的服务器,如果连接上了,输入系统管理员的用户名和密码后,将变得可以像操作本机一样操作远程的电脑,因…

SpringCloud版本名字

SpringCloud版本号字母由来 https://github.com/spring-projects/spring-cloud/wiki SpringCloud最新版Hoxton SpringCloud官网 https://spring.io/projects/spring-cloud#learn

Lua学习教程之 可变參数数据打包与解包

利用table的pack与unpack进行数据打包与解包。測试代码例如以下: print("Test table.pack()----------------");function printTable ( t )if type(t) "table" thenfor k,v in pairs(t) doprintTable(v);endelseprint(t);end endlocal packData function(…

程序员20句励志名言

1、作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具。2、程序员可以让步,却不可以退缩,可以羞涩,却不可以软弱,总之,程序员必须是勇…

SpringCloud主要组件

SpringCloud主要组件 SpringCloud组件停更说明

求数组中的最小子数组,时间复杂度o(n),java

石家庄铁道大学 信1405-1 班 唐炳辉 题目:给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。 设计思路:两个变量 ,一个记录当前并入的数组的值,另外一个记录所算过得最大的数组的值,当并入的值为小于…