2011年4月26日 星期二

使用 ListView 元件時該注意的技巧 - I

The tricks when using ListViews - I

綜觀 Android 目前所提供的 UI 元件 (Views),除了 TextView, Button 等元件之外,ListView 應該是最常被使用到的元件之一。

這主要是因為手機多是左右窄、上下長的螢幕,當要顯示很多資料時,垂直捲動會比水平捲動來得容易操作許多。另外,為了便利使用者能快速消化你所呈現的資料,你必須將資料以較為有系統與組織的方式呈現。而用 ListView 來以條列式的方式呈現你的資料,就是手機應用的最好選擇。

如果你有寫過 Android 應用,我想你一定有用過 ListView。不過,你對 ListView 的了解有多少?你知道使用 ListView 元件時,有哪些該注意的技巧嗎?

ListView 最基本的用法就是透過 ArrayAdapter,直接顯示文字的列表。

關於這,你可以閱讀 ListView with default ArrayAdapter 範例,他有很清楚的說明。

如果 ListView 中的每個項目,不是單純的文字,要有些變化時,那你一定要寫自己的 ListAdapter。

API Demos 範例集中,就有 ListView with a custom ListAdapter 這個範例,教你如何寫自己的 ListAdapter。

在上面範例中,雖然已經有處理 convertView 這件事。不過當你的 list item 很複雜 (好幾層的 UI hierarchy 或 Views 很多) 時,每次都呼叫 findViewById() 所浪費的時間,還是會讓捲動變的緩慢。要解決這個問題,這篇 Layout Tricks: Creating Efficient Layouts 會教你如何降低你的 UI hierarchy。另外,你也要看一下 ListView with an efficient ListAdapter 這個範例中所使用的技巧。

如果你的 list item 並不複雜,但捲動時還是很鈍鈍的。那我建議你看一下 ListView with lazy-loading 這個範例。

當你的 ListView 中有成千上百個項目時,除了加 android:fastScrollEnabled="true" 可以方便使用者快速捲動外。更好的解決方式是加上按鍵過濾的功能。如何實現按鍵過濾的功能?你可以參考 如何在 ListView 上加上按鍵過濾的功能 這篇文章。

除了 ListView 之外,別忘了還有 ExpandableListView 可用。尤其當你的資料是兩層式架構時,用 ExpandableListView 是不錯的選擇。

同樣的 API Demos 中已經有好幾個範例了,你可以從 ExpandableListView 這個先看起。

最後,如果你的 ListView 想要有自己的背景圖或顏色。那你要看一下 ListView Backgrounds: An Optimization 這篇文章。解法其實非常簡單,但不說你都不會想到原來 android:cacheColorHint 是用在這個地方。另外一個不說你不知道的用法是 setTranscriptMode()。如果你想要讓 ListView 捲到最後一個項目,那你要用 setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL),相關說明你可以參考 Listview Scroll to the end of the list after updating the list

下次我們再來看,用 ListView 時常犯的錯誤有哪些。

2 則留言:

Indiana 提到...

範例中降低 UI hierarchy 的方式是透過 RelativeLayout。我記得老師曾在課堂中提過 RelativeLayout 不太好用,一旦要更改 UI,會很麻煩,是嗎?

不過如果是用在 ListView 的 item,應該都不會複雜到哪裡去,所以用 RelativeLayout 應該也還好?

samlu 提到...

RelativeLayout 要更改的確很麻煩,因此當畫面不複雜時才建議使用。的確,ListView 的 item 設計,就是一例。

張貼留言