本節書摘來自異步社群《android ui基礎教程》一書中的第2章,第2.4節顯示清單,作者 【美】jason ostrander,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
2.4 顯示清單
android ui基礎教程
用來開發應用最常見的視圖類型之一就是listview。這個視圖呈現了一個垂直滾動的項目清單。每一行都會有一些文本但是通常也會包含其他視圖,例如imageview和按鈕等(聯系人應用就是很好的例子)。當你需要把資料清單呈現給使用者的時候,使用listview最合适。它是如此常見,以至于android實際上提供了展示一個清單的内置活動。
2.4.1 listactivity
一個listactivity将綁定到一個包含有listview的預設視圖。不必要在活動的oncreate方法中調用setcontentview,因為預設情況下listactivity已經被設定為listview了(當然你可以自定義一個視圖,如果你選擇這麼做的話)。listactivity類也包含了一些搜尋和設定清單資料以及處理項目選擇的友善方法。雖然使用listactivity來展示清單并不是必須,但是當你想要把清單資料展示給使用者時你應該考慮使用它。
android 預設布局
listactivity實際上把它的内容設定到了一個建構于android os上的特殊布局上。這個布局包含内容單一的listview。在建立應用時,還有另一些内置的布局可以使用,許多這類布局都被包含在android.r.layout類中。下面是你可以和listview一起使用的兩個布局。 android.r.layout.simple_list_item_1用來讓一個listview每行顯示一行文本。 android.r.layout.two_line_list_item用來讓清單每行顯示兩行文本。
2.4.2 xml布局
顯示清單很友善,但是有時候你需要展示的遠不止一個清單。在這些情況下,你可以建立一個标準的布局檔案并且使用清單視圖來展示清單。清單視圖和android中的其他視圖使用的定義方式相同:
清單視圖有一些特殊的屬性,可以在更複雜的布局中使用這些屬性。首先是android:entries屬性。當有一個靜态的。不變的值的清單來填充清單視圖時使用這個屬性。你可以通過簡單地引用資源來使用entries屬性,而不需要程式設計來填充清單。還有一些改變外觀和分隔行之間行為的屬性。總的來說,你應該與預設值保持一緻,不要與平台的外觀和感覺相悖。
行布局
為清單行建立布局與為活動建立布局相同:你需要建立一個有布局容器以及一些視圖的xml檔案。每一行都會包含那個布局,這讓你可以設定文本和圖像的值。android平台提供了一些預設的行布局。一般來說對于你想建立的清單視圖這些已經夠用了。然而,你同樣可以為清單行建立自定義的布局。要建立自定義布局,隻需建立一個新的布局檔案并在把資料綁定到清單視圖時使用它。
時間跟蹤應用程式将需要為它的清單視圖自定義布局。在res/檔案夾中,建立一個名為time_row.xml的布局檔案:
這個檔案使用一個簡單的線性布局來展示兩個并排的文本視圖:
一個是會議的名稱,另一個是會議的時間。線性布局使用padding來建立文本視圖之間的空間。
2.4.3 把資料綁定到清單
如果你已經知道清單元素都是哪些,那麼listview的entries屬性将會很管用。但是如果你希望動态生成清單,那麼你需要建立一個清單擴充卡。listadapter基于一些内部的資料存儲往listview中填充資料。有的listadapter是用一個靜态值的地圖來填充清單(與使用xmlentries屬性類似),從數組中載入行,從資料庫中載入資料。listadapter是adapter類的一個具體的例子。adapter類被用于往ui的視圖上綁定資料(在本書之後的内容中,你會了解更多這方面的知識)。
當你建立一個清單适用器之後,你要重寫getview方法。這個方法在清單視圖的每一行都會被系統調用。它會使用清單的位置、任何存在的該行的布局以及該行的父視圖,并且它會傳回行布局視圖。對于時間跟蹤應用來說,你将會使用先前建立的行布局。建立一個繼承自arrayadapter<long>的新類。然後重寫getview方法來為清單視圖的每一行加載自定義的time_row.xml布局。
這種方法為清單視圖的每一行都擴充了一個自定義布局。擴充布局就是把xml布局轉換成一組view對象(在第三章中你會了解更多這方面的知識)。當使用者滾動清單時,系統将會調用這個方法來為清單建立行。那些已經看不見的行将會被回收。在為資料擴充卡配置設定記憶體時你應當當心,避免不必要的記憶體配置設定。不必要的垃圾回收事件是造成android動畫不流暢的主要原因之一。在本書的後面章節中你将會學會如何建立有效率的資料擴充卡。
提示: 若不必要,不要擴充新視圖。在代碼中,視圖隻會在它不存在的情況下才會進行擴充。這是阻止不必要的對象建立以及垃圾回收的一個優化方法。
2.4.4 loader
往清單擴充卡中加載資料可能是一個相當乏味的過程:你需要異步處理事務,以避免在主程序上執行太多工作;你需要在資料改變時重新加載資料擴充卡以保持展示的資料為最新;你還需要在手機的朝向改變時儲存資料,因為在這個過程中會銷毀并重新建立活動。為了簡化這個過程,android 3 引入了一個名叫loader的幫助類。loader類讓異步加載資料變得更加簡單。
loader類通過相容包可以相容所有android版本。此包包括了諸如loader和fragmant之類的新android api,進而你可以在老的android版本中使用它們。在随後的章節中,你會學到更多關于loader和fragment的知識,但到目前為止,你隻需記得你可以通過loader類簡單地把資料綁定到視圖上。
android活動代表使用者的界面。所有與使用者有關的互動都通過活動發生。作為一個開發者,在建立快速響應的應用時把使用者放在第一位很重要。這可能像使用易讀的文本視圖一樣簡單,也可能像使用者查詢時把輸入内容儲存到資料域一樣複雜。了解活動是建立可用的快速響應應用程式的關鍵。