一個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.pswp.cn/news/272017.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272017.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272017.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員職業規劃

每個程序員的職業生涯無非以下幾種情況:一、幫別人掙錢(打工)不管你是剛入職的小兵,還是管人的經理,甚至是唬人的總監,都屬于這一階段。通常程序員在這一階段的職業發展分兩條線,專家&#xff0…

python getattrribute_python操作對象屬性

getattrgetattr(a,b)的作用就和a.b是一樣的。那么這個內建函數有什么作用呢,最方便的無疑是使用它來實現工廠方法(Factory Method)模式。參數說明:object:對象的實例name:字符串,對象的成員函數的名字或者成員變量defa…

電腦處理器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…

【matlab】將matlab中數據輸出保存為txt或dat格式

將matlab中數據輸出保存為txt或dat格式 總結網上各大論壇,主要有三種方法。 第一種方法:save(最簡單基本的) 具體的命令是:用save *.txt -ascii x x為變量 *.txt為文件名,該文件存儲于當前工作目錄下,再打開…

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編譯當今時代,網絡世界處處充滿了危機,對于網絡用戶來說,能夠對各種類型的惡意軟件進行了解,也許有助于在網上沖浪的過程中保全自身。病毒計算機…

Windows下OpenSSL創建CA證書以及客戶端和服務器端證書

打開命令行工具,轉到安裝目錄bin文件夾,$ mkdir -p ./demoCA/{private,newcerts}$ touch ./demoCA/index.txt$ echo 01 > ./demoCA/serial產生的目錄結構如下:-- demoCA/|-- index.txt|-- newcerts/|-- private/-- serial然后執行下面的命…

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之類的命令行工具,來提供一些更加高級的功能如今微軟更進一步,放出一大招,正式…

easyui edatagrid 觸發編輯行回掉onEdit

dg.edatagrid(selectRow, i).edatagrid(beginEdit, i);var opts dg.edatagrid("options");opts.onEdit.call(this, i, rows[i]); 轉載于:https://www.cnblogs.com/zt528/p/5359388.html

修改Windows遠程桌面3389端口

3389端口是Windows 2000(2003) Server 遠程桌面的服務端口,可以通過這個端口,用“遠程桌面”等連接工具來連接到遠程的服務器,如果連接上了,輸入系統管理員的用戶名和密碼后,將變得可以像操作本機一樣操作遠程的電腦,因…

mysql 5.7.17源碼包_centos7 mysql5.7.17源碼安裝

centos7 mysql5.7.17源碼安裝**安裝前準備操作系統環境:Centos 7.21、解決依賴包并下載源碼包至/home/soft/目錄下[rootnode03 ~]# yum -y install gcc gcc-c ncurses ncurses-devel cmake bison[rootnode03 ~]# cd /home/soft/[rootnode03 soft]# wget https://sourceforge.ne…