1. 程式人生 > >Android學習:實現複雜的列表項

Android學習:實現複雜的列表項

實現複雜的列表項,這裡實現的是帶圖片的列表項,主要任務的寫一個BaseAdapter的子類,不過在這之前先構造個存列表項資料的類ListViewCellData,實現建構函式和幾個get方法即可,再在BaseAdapter中構造個數組存放幾組測試資料:

public class ListViewCellData {
	public String name,des;
	public int picId;
	public ListViewCellData(String name,String des,int picId){
		this.name = name;
		this.des = des;
		this.picId = picId;
	}
	public String getName() {
		return name;
	}
	public String getDes() {
		return des;
	}
	public int getPicId() {
		return picId;
	}
}
測試資料,R.drawable.img1是存放在,drawable資料夾下的圖片,命名規則與變數一樣且不能大寫:
	public ListViewCellData[] data= new ListViewCellData[]{
			new ListViewCellData("zhangsan","haoren",R.drawable.img1),
			new ListViewCellData("lisi","huairen",R.drawable.img2),
			new ListViewCellData("wangwu","shagua",R.drawable.img3),
			};

剛剛建好BaseAdapter子類的時候,會讓你重寫四個方法:getCount()、getItem()、getItemId()和getView()

Int getCount()返回Adapter中資料的長度,也就是列表項的數量

Object getItem(int position)是根據position返回對應的列表項

long getItemId(int position)是返回列表項的位置

View getView(int position,View converView,ViewGroup parent)返回列表項的佈局,就是列表中一個列表項的佈局

前三個方法按下面的程式碼稍作修改即可

	@Override
	public int getCount(){
		// TODO Auto-generated method stub
		return data.length;
	}

	@Override
	public ListViewCellData getItem(int position) {
		// TODO Auto-generated method stub
		return data[position];
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

主要任務是對getView方法的重寫,進行重寫之前,先早Layout資料夾下增加一個列表項佈局XML:ListCell,對一條ListView進行描述:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="100dp"
        android:layout_height="100dp"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <TextView
            android:id="@+id/des"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    </LinearLayout>

</LinearLayout>
列表項佈局構造好之後,開始重寫getView方法,首先宣告一個新的LinearLayout的ll用於存放返回列表佈局,之後判斷convertView是否為空,convertView是系統回收的列表項,如果不為空,則說明系統有回收過列表項,這樣直接將convertView強制型別轉換複製給ll,如果為空,則使用LayoutInflater.from.inflate方法將剛才建的佈局ListCell賦值給ll,其中from需要獲取Context,這裡在BaseAdapter中創造建構函式以獲取Context:
	private Context context = null;
	public ListViewAdapter(Context context){
		this.context = context;
	}
	
	public Context getContext(){
		return this.context;
	}

之後通過getItem方法獲取要在一個列表項中存放的資料,同findViewById方法獲取佈局的控制元件,再用setImageResource()、setText()等方法設定控制元件中的內容,最後返回ll即可:

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		LinearLayout ll = null;
		if(convertView!=null){
			ll = (LinearLayout)convertView;
		}
		else{
			ll = (LinearLayout)LayoutInflater.from(getContext()).inflate(R.layout.listcell,null);
		}
		ListViewCellData data = getItem(position);
		ImageView icon = (ImageView)ll.findViewById(R.id.imageView1);
		TextView name = (TextView)ll.findViewById(R.id.name);
		TextView des = (TextView)ll.findViewById(R.id.des);
		
		icon.setImageResource(data.getPicId());
		name.setText(data.getName());
		des.setText(data.getDes());
		
		return ll;
	}
最後在MainActivity中setAdapter中寫入剛才寫的BaseAdapter就行了:
	private ListView lv = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView)findViewById(R.id.listView);
        lv.setAdapter(new ListViewAdapter(this));
    }
還有一種方法不用宣告ListView,就是直接繼承ListActivity類,然後繫結有ID為@android:id/list列表的佈局即可:
public class ListViewActivity extends ListActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        setListAdapter(new ListViewAdapter(this));
    }

}
帶ID為@android:id/list列表的佈局:
    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>