ListView簡介及Adapter詳解
ListView簡介
ListView是一種列表佈局其,將Adapter所提供的各個控制元件顯示在一個垂直且可滾動的列表中。需要注意的為建立介面卡並將其設定給ListView。 列表元素通過Adapter自動插入到列表。 列表佈局的關鍵部分: 1.佈局檔案中定義ListView 2.Adapter用來將資料填充到ListView 3.要填充到ListView的資料,這些資料可以字串、圖片、控制元件等等 Adapter是LlistView和資料來源之間的一個溝通橋樑,根據不同的資料來源可以三種不同的Adapter: 1.ArrayAdapter:String【】 2.SimpleAdapter:Llist<map<String,?>> 3.BaseAdapter
ArrayAdapter的使用 1.介紹:ArrayAdapter由3個引數進行構造,第一個為Context,第二個為在R檔案中定義的Layout,也可用系統的R檔案,第三個引數是一個數組,陣列中每一項的型別沒有限制。 2.程式碼 MainActivity層
private static String[] data={"a","b","c","d"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.main); ListView listview=new ListView(this); ArrayAdapter adapter=new ArrayAdapter<String>(this, android.R.layout.arrayExample,data);//資料介面卡 listview.setAdapter(adapter);//向元件增加資料 setContentView(listview); }
Activity層
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:gravity="center_horizontal" />
SimpleAdapter的使用 1.介紹 SimpleAdapter的ArrayList裡的每一項都是一個Map<String,?>型別,每一項Map物件都和ListV中的一項進行資料繫結一一對應。 2.程式碼 MainActivity層
private ListView listview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
listview=new ListView(this);
data2 = new ArrayList<Map<String, Object>>();
Map<String, Object> item;
item = new HashMap<String, Object>();
item.put("姓名", "張三");
item.put("性別", "男");
item.put("年齡", "25");
data2.add(item);
item = new HashMap<String, Object>();
item.put("姓名", "李四");
item.put("性別", "男");
item.put("年齡", "33");
data2.add(item);
item = new HashMap<String, Object>();
item.put("姓名", "小王");
item.put("性別", "女");
item.put("年齡", "31");
data2.add(item);
SimpleAdapter adapter = new SimpleAdapter(this, data2,
R.layout.simplelayout, new String[] { "姓名", "性別","年齡" }, new int[] {R.id.tv01, R.id.tv02,R.id.tv03 });
listview.setAdapter(adapter);
setContentView(listview);
Activity層
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="horizontal">
<TextView android:id="@+id/tv01" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:width="150dp" />
<TextView android:id="@+id/tv02" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:width="150dp"/>
<TextView android:id="@+id/tv03" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:width="150dp"/>
</LinearLayout>
BaseAdapter的使用 1.介紹 BaseAdapter是一個介面,我們需要自己實現它的方法(getView方法,getItemId方法,getItem方法以及getCount方法) 2.程式碼 MainActivity層
public class mainActivity extends Activity {
/** Called when the activity is first created. */
int [] drawableIds={R.drawable.img01,R.drawable.img02,R.drawable.img03};
int [] msgIds={R.string.str1,R.string.str2,R.string.str3};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listview=(ListView) findViewById(R.id.listview01);
BaseAdapter ba=new BaseAdapter() {
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LinearLayout ll=new LinearLayout(mainActivity.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setPadding(5, 5, 5, 5);
ImageView ii=new ImageView(mainActivity.this);
ii.setImageDrawable(getResources().getDrawable(drawableIds[position]));
ii.setScaleType(ImageView.ScaleType.FIT_XY);
ii.setLayoutParams(new Gallery.LayoutParams(50,50));
ll.addView(ii);
TextView tv=new TextView(mainActivity.this);
tv.setText(getResources().getText(msgIds[position]));
tv.setTextSize(24);
tv.setTextColor(mainActivity.this.getResources().getColor(R.color.white));
tv.setPadding(5, 5, 5, 5);
tv.setGravity(Gravity.LEFT);
ll.addView(tv);
return ll;
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 3;
}
};
listview.setAdapter(ba);
}
}
}
效果 3.程式碼分析 由於程式碼比較混亂下面稍微進行分析一下,來理清一下思路
自定義Adapter子類,就需要實現上面幾個方法,其中最重要的是getView()方法,它是將獲取資料後的View元件返回,如ListView中每一行裡的TextView、Gallery中的每個ImageView。 BaseAdapter是實現了ListAdapter和SpinnerAdapter兩個介面,當然它也可以直接給ListView和Spinner等UI元件直接提供資料。 BaseAdpater型別執行詳解: 1.listView在開始繪製的時候,系統首先呼叫getCount()函式,根據他的返回值得到 listView的長度,然後根據這個長度,呼叫getView()逐一繪製每一行。如果你的 getCount()返回值是0的話,列表將不顯示同樣return 1,就只顯示一行。系統顯示列表時,首先例項化一個介面卡(這裡將例項化自定義的介面卡)。當手動完成適配時,必須手動對映資料,這需要重寫getView()方 法。
2.系統在繪製列表的每一行的時候將呼叫此方法。getView()有三個引數,position表示將顯示的是第幾行,covertView是從佈局文 件中inflate來的佈局。我們用LayoutInflater的方法將定義好的item.xml檔案提取成View例項用來顯示。然後將xml檔案中 的各個元件例項化(簡單的findViewById()方法)。這樣便可以將資料對應到各個元件上了。但是按鈕為了響應點選事件,需要為它新增點選監聽 器,這樣就能捕獲點選事件。
3.至此一個自定義的listView就完成了,現在讓我們回過頭從新審視這個過程。系統要繪製ListView了,他首先獲得要 繪製的這個列表的長度,然後開始繪製第一行,怎麼繪製呢?呼叫getView()函式。在這個函式裡面首先獲得一個View(實際上是一個 ViewGroup),然後再例項並設定各個元件,顯示之。好了,繪製完這一行了。那再繪製下一行,直到繪完為止