星期四, 8月 21, 2014

Building Layouts with an Adapter

當內容對於你的layout來說是動態的或事先無法決定的,你可以使用AdapterView在執行中填充layout。AdapterView類別的子類運用一個Adapter將資料綁定在Layout上。Adapter扮演中介的角色介於資料來源與AdapterView layout之間,Adapter取出資料(從陣列或資料庫查詢等來源),並轉換每個輸入為一個view加到AdapterView layout中。

常見有Adapter的Layout有
  • ListView
  • GridView
Filling an adapter view with data

你可以藉由將AdapterView實例綁定一個Adapter來填充AdapterView如ListView或GridView,Adapter會從外部來源取出資料並為每一個輸入建立一個View。

Android提供許多Adapter的子類用來取出不同種類的資料,兩種最常見的Adapter是ArrayAdapter和SimpleCusorAdapter。


ArrayAdapter

當資料來源是陣列時使用ArrayAdapter。預設的情況下,ArrayAdapter藉由在每個陣列項目上呼叫toString()並把內容放入TextView中為每個陣列項目建立view。

例如,如果你有一個字串陣列想顯示在ListView上,利用建構子傳入對於每個字串的layout和字串陣列來初始化一個新的ArrayAdapter。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, myStringArray);
此建構子的參數包含
  • 你的app的Context
  • 供陣列中每個字串的Layout,包含了一個TextView
  • 字串陣列
然後簡單地在ListView上呼叫setAdapter():
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
可以複寫toString()來客製化每個陣列項目的外觀,或是可以為每個陣列項目建立不同於TextView的view(例如ImageView),繼承ArrayAadapter類別複寫getView()方法回傳想供給每個陣列項目的類型。


SimpleCursorAdapter

當資料來自Cursor時使用SimpleCursorAdapter。使用SimpleCursorAdapter時,必須指定一個layout給在Cursor的每一個row且每個columns應該被插入layout中的view。例如,想要建立一個人名和電話的列表,可以執行的一個查詢回傳Cursor,包含一個row為一個人,columns為人名和電話,接著建立一個字串陣列指定從Cursor中的哪個Column是想在Layout中的及建立一個整數陣列指定每個column相對應的view。
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Phone.NUMBER};
int[] toViews = {R.id.display_name, R.id.phone_number};
當你建立SimpleCursorAdapter實例,傳入layout、Cursor、這兩個陣列。
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
        R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);
ListView listView = getListView();
listView.setAdapter(adapter);
如果你的應用程式在生命週期中,改變了油Adapter讀取的數據,應該呼叫notifyDataSetChanged()方法,這將通知你的view,數據已經改變,應該刷新本身。


Handing click events

可以藉由執行AdapterView.onItemClickListener介面回應在AdapterView中的每個項目。

// Create a message handling object as an anonymous class.
private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {
    public void onItemClick(AdapterView parent, View v, int position, long id) {
        // Do something in response to the click
    }
};

listView.setOnItemClickListener(mMessageClickedHandler);



沒有留言:

張貼留言