當你的佈局內容是動態的或者不是事先確定的,你可以使用一個繼承自適配器視圖(AdpaterView
)的佈局在運行時利用視圖元素構建佈局。適配器視圖類的子類使用一個適配器將數據和它的佈局綁定。適配器(Adapter
)作爲一個數據源和適配器視圖佈局之間的中間件,適配器獲取數據(從數組或者數據庫中)並且將每一項轉換爲視圖元素並添加到適配器視圖佈局中。由適配器支持的佈局包括列表視圖和網格視圖。
使用數據填充適配器視圖
你可以通過將一個適配器視圖實例綁定到一個適配器上構建一個適配器視圖(例如列表視圖或網格視圖),適配器從一個外部數據源中獲取數據並且創建一個顯示每個數據的視圖。
Android
提供了幾個適配器的子類,來幫助獲取各種各樣的數據併爲每個適配器視圖創建視圖。兩個最常用的適配器是數組適配器(ArrayAdapter)和簡單遊標適配器(SimpleCursorAdapter)。
數組適配器
當你的數據源是數組時,可以使用這個適配器。默認情況下,數組適配器通過調用每個元素的toString()
方法並且將內容放置在一個文本視圖(TextView
)來爲每個數組項創建一個視圖。
例如,如果你有一個你想要顯示在列表視圖中的字符串數組,你可以使用一個構造函數來初始化一個新的數組適配器,爲每個字符串和字符串矩陣指定佈局:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout_simple_list_item_1, myStringArray);
這個構造器的參數爲:你的應用程序上下文,爲數組中的每一個字符串包含一個文本視圖的佈局和字符串數組。
然後簡單地調用列表視圖的setAdapter()
方法。
ListView listView = (ListView) findViewById(R.id.listview);
listview.setAdapter(adapter);
爲了定製每項的外觀,你可以重載你的數組中的對象的toString()
方法。如果你想要爲每一項創建一個新的視圖,而不是簡單的一個文本視圖(例如,爲每一個數組元素安排一個圖像視圖(ImageView
)),那麼需要擴展數組適配器類並且重載其getView()
方法來返回你想要爲每一項安排的視圖類型。
簡單遊標適配器
當你的數據來自於一個遊標時,使用這個適配器。當使用簡單遊標適配器時,你必須爲遊標中的每一行指定一個使用的佈局,並指定遊標中的哪些列應該插入該佈局中的哪些視圖。例如,如果你想要創建一列人名和電話號碼,你可以執行一個返回遊標的查詢,該遊標中每個人佔一行,列包括名字和號碼。然後你可以創建一個字符串數組指定這個遊標中的哪些列你想要顯示在佈局中,並且創建一個整數矩陣指定每一列應該放置的相應的視圖。
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER);
int[] toViews={R.id.display_name, R.id.phone_number);
當你實例化簡單遊標適配器時,將每個結果使用的佈局、包含結果數據的遊標和上述兩個矩陣傳給它:
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.person.name_and_number, cursor, froColumns, toViews, 0);
ListView listView = getListView();
listView.setAdapter(adapter);
簡單遊標適配器之後通過將每一個在fromColumns
的項插入提供的佈局中對應的toViews
視圖中爲每一行創建一個視圖。
如果在你的應用程序的生命週期中,你改變了供你的適配器讀的數據,你應該調用notifyDataSetChanged()
方法通知相關的視圖刷新。
處理點擊事件
你可以通過實現AdapterView.OnItemClickListener
接口響應適配器視圖中的每一項的點擊事件,。例如:
private OnItemClickListener mMessageClickedHandler = new OnItemClickListener(){
public void onItemClick(AdapterView parent, View v, int position, long id)
{
}
}
listView.setOnItemClickListener(mMessageClickedHandler);
原文
http://wear.techbrood.com/guide/topics/ui/declaring-layout.html