一個App完成入門篇(五)- 完成新聞頁面

来源:http://www.cnblogs.com/wjiaonianhua/archive/2016/04/05/5353693.html
-Advertisement-
Play Games

本節教程將介紹如何用DeviceOne簡單而高效的完成一個新聞頁面。 導入項目 數據模板分離MVVM模型 自定義事件 展示新聞 九宮格展示 將要學習的demo效果圖如下所示 1. 導入完整項目 本節示例demo請參考下載地址,可以導入到設計器中學習。 為了方便大家理解頁面結構,請參考下圖圖中紅框所示 ...


本節教程將介紹如何用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顯示出來即可。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 初始化一個map 1 2 3 4 5 Map<String, String> map = new HashMap<String, String>(); map.put("1", "hell"); map.put("2", "hello"); map.put("3", "hel"); map.put( ...
  • 幹掉這道題的那一刻,我只想說:我終於**的AC了!!! 最終記憶體1344K,耗時10282ms,比起歸併樹、劃分樹以及其他各種黑科技,這個成績並不算光彩⊙﹏⊙ 但至少,從最初的無數次TLE到最終的AC,這過程見證了一個二分演算法的艱辛優化 先貼代碼: 1 const int bktSize=1024; ...
  • 現在編程的主流語言基本上都是面向對象的。如C#,C++,JAVA。我們在使用時,已經構造了一個個的類。但是往往由於我們在類內部或外部的設計上存在種種問題,導致儘管是面向對象的語言,卻是面向過程的邏輯,甚至維護起來異常困難。每次增加或修改功能都要改動很多的代碼,如履薄冰。而面向對象的六大原則主要的目的 ...
  • 一、設計目的 從事.Net平臺開發系統已有8年多了,一直思考搭建.Net分散式系統架構。基於window平臺搭建的大型分散式系統不多,之前瞭解過myspace、stackoverflow等大型網站。搭建一個大型平臺需要綜合考慮很多方面,不單純是軟體架構,還包括網路和硬體設備等。由於現代大部分應用建設 ...
  • 本文介紹一個jquery的小技巧,能讓任意組件對象都能支持類似DOM的事件管理,也就是說除了派發事件,添加或刪除事件監聽器,還能支持事件冒泡,阻止事件預設行為等等。在jquery的幫助下,使用這個方法來管理普通對象的事件就跟管理DOM對象的事件一模一樣,雖然在最後當你看到這個小技巧的具體內容時,你可... ...
  • <select>: 1 2 3 4 5 6 7 8 9 10 奪得2008年歐洲杯冠軍的國家是: <select name="nation" id="nation"> <option value="">請選擇</option> <option value="Germany">德國</option> ...
  • 從事前端開發工作也有一定的時間了,在這段時間里,由一個基本的前端開發開始,做到前端經理;基本上算是走過了所有前端開發都走過的路,今天主要分享下我這一路走來,對前端的理解。 我開始接觸前端的時候,其實稱不上是所謂的開發,更多的是現在多數人對前端的理解-美工,當時負責的工作就是將PSD轉化為HTML頁面 ...
  • 通常對於無刷新提交表單,我們都是運用ajax實現的。前段時間跟著老大瞭解到另一種無刷新提交表單的方法,是利用iframe框架實現的。現在整理出來分享給大家。 第一種: (html頁面) <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset= ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...