Android 控制項之ListView
--學習筆記5(金海建)
目的:學習listview的使用方法
在Android中listview是比較常用的控制項,根據列表的適配器類型,列表分為三種,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最為簡單,只能展示一行字。SimpleAdapter有最好的擴充性,可以自訂出各種效果。SimpleCursorAdapter可以認為是SimpleAdapter對資料庫的簡單結合,可以方面的把資料庫的內容以列表的形式展示出來。
Listview的實現:
1.準備ListView要顯示的資料,一維數組、多維陣列
2.根據不同的應用,構建適配器
3.把適配器添加到ListView中。
寫一個簡單的程式,添加三個菜單,分別來測試ArrayAdapter、SimpleCursorAdapter和SimpleAdapter
ArrayAdapter
listviewlayout.xml
<?xml version="1.0" encoding="utf-8"?><br /><TextView android:text="@+id/TextView01"<br />android:id="@+id/TextView01"<br />android:layout_height="wrap_content"<br />xmlns:android="http://schemas.android.com/apk/res/android"<br />android:textStyle="bold" android:textSize="24px"<br />android:layout_width="match_parent"><br /></TextView><br />
import java.util.List;<br />import java.util.ArrayList;<br />import android.widget.AdapterView.OnItemSelectedListener;<br />import android.widget.AdapterView.OnItemClickListener;<br />public class TestListView extends Activity {<br /> /** Called when the activity is first created. */</p><p>private ListView m_listview;<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);</p><p> m_listview = new ListView(this);<br /> m_listview.setAdapter(new ArrayAdapter<String>(this, R.layout.listviewlayout, getData()));<br /> setContentView(m_listview);</p><p> m_listview.setOnItemSelectedListener(new OnItemSelectedListener()<br /> {<br />@Override<br />public void onItemSelected<br />(AdapterView<?> parent, View view, int position, long id)<br />{<br />DisplayToast("選擇了第" + position + "行");<br />}<br />public void onNothingSelected(AdapterView<?> arg0) {<br />}</p><p> });<br />private List<String> getData()<br /> {<br /> final List<String> data = new ArrayList<String>();<br /> data.add("第一行...");<br /> data.add("第二行...");<br /> data.add("第三行...");<br /> data.add("第四行...");<br /> return data;<br /> }</p><p> public void DisplayToast(String str)<br /> {<br /> Toast.makeText(this, str, Toast.LENGTH_SHORT).show();<br /> }<br />}<br />
上面的代碼使用了ArrayAdapter(Context context, int textViewResourceId, T[] objects)來構建Adapter。
textViewResourceId為listview視圖的layout,在listviewlayout.xml中定義了TextView的layout。T[]object就是我們要傳入的字串數組。最後調用ListView的setAdapter來顯示。
運行效果如下:
SimpleCursorAdapter
SimpleCursorAdapter跟ArrayAdapter的區別在於,SimpleCursorAdapter的資料來源自資料庫,通過Cursor來擷取。看來SimpleCursorAdapter 的建構函式。SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to),前兩個參數跟ArrayAdapter一樣,c是資料庫遊標指標,form是資料庫的列,用字元表示,to表示要顯示的控制項的id。From和to是一一對應。這樣每一列都對應一個控制項的顯示。
我們現在模擬器上建立幾條連絡人,然後讀取連絡人、顯示到ListView中。
import android.database.Cursor;<br />public class CursorAdapterListView extends Activity {<br /> /** Called when the activity is first created. */</p><p>private ListView m_listview;<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);</p><p> Cursor cur = this.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,<br /> null, null, null, null);</p><p> m_listview = new ListView(this);<br /> SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.listviewlayout,<br /> cur, new String[] {Contacts.DISPLAY_NAME},<br /> new int[] {R.id.TextView01});</p><p> m_listview.setAdapter( adapter);<br /> setContentView(m_listview);</p><p> }<br /> public void DisplayToast(String str)<br /> {<br /> Toast.makeText(this, str, Toast.LENGTH_SHORT).show();<br /> }<br />}<br />
SimpleAdapter
從資料庫中讀取號碼,然後顯示出來。去具體的連絡人資訊要用到ContactsContract.CommonDataKinds.Phone.CONTENT_URI
代碼如下:
import android.util.Log;<br />import java.lang.Integer;<br />public class SampleAdapterListView extends Activity {<br /> /** Called when the activity is first created. */</p><p>private ArrayList<HashMap<String, Object>> m_listitems;</p><p>private ListView m_listview;<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);</p><p> m_listview = new ListView(this);<br /> m_listitems = GetContactInfo();</p><p> m_listview.setAdapter(new SimpleAdapter(this, m_listitems,<br /> R.layout.sampleadapterlayout,<br /> new String[]{"Name", "Number"},<br /> new int []{R.id.contactname, R.id.phonenumber} ));<br /> setContentView(m_listview);</p><p> m_listview.setOnItemSelectedListener(new OnItemSelectedListener()<br /> {<br />@Override<br />public void onItemSelected(AdapterView<?> parent, View view, int position, long id)<br />{<br />DisplayToast("選擇了第" + position + "行");<br />}<br />public void onNothingSelected(AdapterView<?> arg0) {<br />}</p><p> });</p><p> m_listview.setOnItemClickListener(new OnItemClickListener()<br /> {<br />@Override<br />public void onItemClick(AdapterView<?> parent, View view, int position, long id)<br />{<br />//ArrayList<HashMap<String, Object>> adpter = (ArrayList<HashMap<String, Object>>)parent.getAdapter();<br />HashMap<String, Object> item = m_listitems.get(position);</p><p>String strName = (String)item.get("Name");<br />String strNumber = (String)item.get("Number");<br />DisplayToast(strName + strNumber);<br />}</p><p> });<br /> }<br /> private ArrayList<HashMap<String, Object>> GetContactInfo()<br /> {<br /> ArrayList<HashMap<String, Object>> listitems = new ArrayList<HashMap<String, Object>>();</p><p> Cursor cur = this.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,<br /> null, null, null, null);<br /> cur.moveToFirst();</p><p> do<br /> {<br /> HashMap<String, Object> item = new HashMap<String, Object>();<br /> String szContactName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));<br /> String szId = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));<br /> String szHasNumber = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));</p><p> item.put("Name", szContactName);<br /> if(szHasNumber.compareTo("1") == 0)<br /> {<br /> Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ szId,null, null);<br /> while (phones.moveToNext())<br /> { </p><p> String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));<br /> String phoneTpye = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); </p><p> if(new Integer(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE).toString().compareTo(phoneTpye) == 0)<br /> {<br /> item.put("Number", "Mobile: " + phoneNumber); // 多個號碼如何處理<br /> }<br /> else<br /> {<br /> item.put("Number", "Home:" + phoneNumber); // 多個號碼如何處理<br /> }<br /> item.put("Type", phoneTpye);</p><p> Log.v("TestContacts", "Name:" + szContactName + " Number:" + phoneNumber + " Type:" + phoneTpye);<br /> }<br /> phones.close();<br /> }<br /> listitems.add(item);<br /> }while(cur.moveToNext());</p><p> cur.close();<br /> return listitems;<br /> }</p><p>public void DisplayToast(String str)<br /> {<br /> Toast.makeText(this, str, Toast.LENGTH_SHORT).show();<br /> }<br />}<br />
: