適配器包括ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。以及自定義適配器。android
數據來源:String[]和List數據庫
publicclassArrayAdapterActivityextendsListActivity{
privateListView listView;
@Override
publicvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
String[] strs ={"1","2","3","4","5"};
ArrayAdapter<String> adapter =
newArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strs);
setListAdapter(adapter);
}
}
}
publicclassMyListViewextendsActivity{
privateListView listView;
@Override
publicvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
ArrayAdapter<String> adapter =
newArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData());
listView =newListView(this);
listView.setAdapter();
setContentView(listView);
}
privateList<String> getData(){
List<String> data =newArrayList<String>();
data.add("測試數據1");
data.add("測試數據2");
data.add("測試數據3");
data.add("測試數據4");
return data;
}
}
上面代碼使用了Adapter(Context context, int resourcefulness, List objects)來裝配數據,要裝配這些數據就須要一個鏈接List View視圖對象和數組數據的適配器來二者的適配工做,Adapter的構造須要三個參數,依次爲this,佈局文件(注意這裏的佈局文件描述的是列表的每一行的佈局,android.R.layout.simple_list_item_1是系統定義好的佈局文件只顯示一行文字,數據源(一個List集合)。同時用adapter()完成適配的最後工做。數組
SimpleAdapter的擴展性最好,能夠定義各類各樣的佈局出來,能夠放上ImageView(圖片),還能夠放上Button(按鈕),CheckBox(複選框)等等。下面的代碼都直接繼承了ListActivity,ListActivity和普通的Activity沒有太大的差異,不一樣就是對顯示ListView作了許多優化,方面顯示而已。ide
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"/>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="20sp"/>
</LinearLayout>
publicclassSimpleAdapterActivityextendsListActivity{
@Override
publicvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
SimpleAdapter adapter =
newSimpleAdapter(this, getData(), R.layout.simple,
newString[]{"title","img"},
newint[]{ R.id.title, R.id.img }
);
setListAdapter(adapter);
}
privateList<Map<String,Object>> getData(){
//map.put(參數名字,參數值)
List<Map<String,Object>> list =newArrayList<Map<String,Object>>();
Map<String,Object> map =null;
map =newHashMap<String,Object>();
map.put("title","摩托羅拉");
map.put("img", R.drawable.icon);
list.add(map);
map =newHashMap<String,Object>();
map.put("title","諾基亞");
map.put("img", R.drawable.icon);
list.add(map);
map =newHashMap<String,Object>();
map.put("title","三星");
map.put("img", R.drawable.icon);
list.add(map);
return list;
}
}
publicclassSimpleCursorAdapterActivityextendsListActivity{
@Override
publicvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//得到一個指向系統通信錄數據庫的Cursor對象得到數據來源
Cursor cur = getContentResolver().query(People.CONTENT_URI,null,null,null,null);
startManagingCursor(cur);
//實例化列表適配器
ListAdapter adapter =newSimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cur,
newString[]{People.NAME},
newint[]{android.R.id.text1});
setListAdapter(adapter);
}
}
有時候,列表不光會用來作顯示用,咱們一樣能夠在在上面添加按鈕。添加按鈕首先要寫一個有按鈕的xml文件,而後天然會想到用上面的方法定義一個適配器,而後將數據映射到佈局文件上。可是事實並不是這樣,由於按鈕是沒法映射的,即便你成功的用佈局文件顯示出了按鈕也沒法添加按鈕的響應,這時就要研究一下ListView是如何現實的了,並且必需要重寫一個類繼承BaseAdapter。下面的示例將顯示一個按鈕和一個圖片,兩行字若是單擊按鈕將刪除此按鈕的所在行。並告訴你ListView到底是如何工做的。函數
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5px"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="22px"/>
<TextView
android:id="@+id/info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="13px"/>
</LinearLayout>
<Button
android:id="@+id/view_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/s_view_btn"
android:layout_gravity="bottom|right"/>
</LinearLayout>
publicclassMyListView4extendsListActivity{
privateList<Map<String,Object>> mData;
@Override
publicvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mData = getData();
MyAdapter adapter =newMyAdapter(this);
setListAdapter(adapter);
}
privateList<Map<String,Object>> getData(){
List<Map<String,Object>> list =newArrayList<Map<String,Object>>();
Map<String,Object> map =null;
map =newHashMap<String,Object>();
map.put("title","G1");
map.put("info","google 1");
map.put("img", R.drawable.i1);
list.add(map);
map =newHashMap<String,Object>();
map.put("title","G2");
map.put("info","google 2");
map.put("img", R.drawable.i2);
list.add(map);
map =newHashMap<String,Object>();
map.put("title","G3");
map.put("info","google 3");
map.put("img", R.drawable.i3);
list.add(map);
return list;
}
// ListView 中某項被選中後的邏輯
@Override
protectedvoid onListItemClick(ListView l,View v,int position,long id){
Log.v("MyListView4-click",(String)mData.get(position).get("title"));
}
//listview中點擊按鍵彈出對話框
publicvoid showInfo(){
newAlertDialog.Builder(this)
.setTitle("個人listview")
.setMessage("介紹...")
.setPositiveButton("肯定",newDialogInterface.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog,int which){
}
})
.show();
}
/** 當Listie有大量的數據須要加載的時候,會佔據大量內存,影響性能,這時候 要按需填充並從新使用view來減小對象的建立
*最快的方式是定義一個Pewholder,將convex的tag設置爲Pewholder,不爲空時從新使用便可
*/
publicfinalclassViewHolder{
publicImageView img;
publicTextView title;
publicTextView info;
publicButton viewBtn;
}
publicclassMyAdapterextendsBaseAdapter{
privateLayoutInflater mInflater;
publicMyAdapter(Context context){
this.mInflater =LayoutInflater.from(context);
}
@Override
publicint getCount(){
return mData.size();
}
@Override
publicObject getItem(int arg0){
returnnull;
}
@Override
publiclong getItemId(int arg0){
return0;
}
@Override
publicView getView(int position,View convertView,ViewGroup parent){
ViewHolder holder =null;
if(convertView ==null){
holder=newViewHolder();
convertView = mInflater.inflate(R.layout.vlist2,null);
holder.img =(ImageView)convertView.findViewById(R.id.img);
holder.title =(TextView)convertView.findViewById(R.id.title);
holder.info =(TextView)convertView.findViewById(R.id.info);
holder.viewBtn =(Button)convertView.findViewById(R.id.view_btn);
convertView.setTag(holder);
}else{
holder =(ViewHolder)convertView.getTag();
}
holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
holder.title.setText((String)mData.get(position).get("title"));
holder.info.setText((String)mData.get(position).get("info"));
holder.viewBtn.setOnClickListener(newView.OnClickListener(){
@Override
publicvoid onClick(View v){
showInfo();
}
});
return convertView;
}
}
}
下面將對上述代碼,作詳細的解釋
listView在開始繪製的時候,系統首先調用getCount()函數,根據他的返回值獲得listView的長度,而後根據這個長度,調用getView()逐一繪製每一行。若是你的getCount()返回值是0的話,列表將不顯示一樣return 1,就只顯示一行。佈局
系統顯示列表時,首先實例化一個適配器(這裏將實例化自定義的適配器)。當手動完成適配時,必須手動映射數據,這須要重寫getView()方法。系統在繪製列表的每一行的時候將調用此方法。
getView()有三個參數,position表示將顯示的是第幾行,covertView是從佈局文件中inflate來的佈局。咱們用LayoutInflater的方法將定義好的vlist2.xml文件提取成View實例用來顯示。而後將xml文件中的各個組件實例化(簡單的findViewById()方法)。這樣即可以將數據對應到各個組件上了。可是按鈕爲了響應點擊事件,須要爲它添加點擊監聽器,這樣就能捕獲點擊事件。至此一個自定義的listView就完成了,如今讓咱們回過頭重新審視這個過程。系統要繪製ListView了,他首先得到要繪製的這個列表的長度,而後開始繪製第一行,怎麼繪製呢?調用getView()函數。在這個函數裏面首先得到一個View(其實是一個ViewGroup),而後再實例並設置各個組件,顯示之。好了,繪製完這一行了。那再繪製下一行,直到繪完爲止。在實際的運行過程當中會發現listView的每一行沒有焦點了,這是由於Button搶奪了listView的焦點,只要佈局文件中將Button設置爲沒有焦點就OK了。性能