1. 程式人生 > >ListView簡介及Adapter詳解

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),然後再例項並設定各個元件,顯示之。好了,繪製完這一行了。那再繪製下一行,直到繪完為止