天天看點

Android自定義adapter的listview

在開發中,我們經常使用到ListView這個控件,但ListView自帶适配SimpleAdapter,SimpleCursorAdapter等擴充性比較差(如Button,imageView等),嚴重制約我們的開發。不過Android也提供自定義的擴充卡adapter給我擴充這些控件,下面做個簡單例子(listview裡面含有textview,imageview,button)

1.定義一個資料類,不用資料集,也是為擴充

public class Data {
<span style="white-space:pre">	</span>private int img_id;//圖檔id
<span style="white-space:pre">	</span>private String name;//名字
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>public Data(int img_id, String name) {
<span style="white-space:pre">		</span>super();
<span style="white-space:pre">		</span>this.img_id = img_id;
<span style="white-space:pre">		</span>this.name = name;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>public int getImg_id() {
<span style="white-space:pre">		</span>return img_id;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>public void setImg_id(int img_id) {
<span style="white-space:pre">		</span>this.img_id = img_id;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>public String getName() {
<span style="white-space:pre">		</span>return name;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>public void setName(String name) {
<span style="white-space:pre">		</span>this.name = name;
<span style="white-space:pre">	</span>}<span style="white-space:pre">		</span>
<span style="white-space:pre">		</span>
}           

2.每個列需顯示的内容

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000" >
    <LinearLayout 
        android:gravity="center"
<span style="white-space:pre">	</span>android:layout_width="wrap_content"
    	android:layout_height="wrap_content" >
      	<ImageView 
			android:layout_width="50dp"
    		android:layout_height="50dp"
    		android:id="@+id/img"
    		android:src="@drawable/ic_launcher"
        />  

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff" />
    
    </LinearLayout>
	<Button 
	    android:layout_alignParentRight="true"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:id="@+id/bt"
		android:text="@string/comfirm"
    />

</RelativeLayout>           

3.自定義擴充卡adapter

public class Adapter extends BaseAdapter{

	private Context context;
	private int itemLayoutID;
	private int[] itemIds;
    <span style="white-space:pre">	</span>private List<Data> dataList;
	
    <span style="white-space:pre">	</span>public Adapter(Context context, int itemLayoutID,
			int[] itemIds, List<Data> dataList ) {
        <span style="white-space:pre">	</span>this.context = context;
		this.itemLayoutID = itemLayoutID;
		this.itemIds = itemIds;
		this.dataList = dataList;
   <span style="white-space:pre">	</span> }
    
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return dataList.size();
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return dataList.get(arg0);
	}

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ViewHolder holder;
		if (convertView == null) {//定義每行的布局
			LayoutInflater layoutInflater = LayoutInflater.from(context);
			convertView = layoutInflater.inflate(itemLayoutID, null);
			holder = new ViewHolder();
			holder.name = (TextView) convertView
					.findViewById(itemIds[1]);
			holder.image = (ImageView) convertView
					.findViewById(itemIds[0]);
			holder.bt = (Button) convertView
					.findViewById(itemIds[2]);
			convertView.setTag(holder);
			
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		
		//根據listview的位置擷取資料
		final String name = dataList.get(position).getName();
		holder.name.setText(name);
		holder.image.setImageResource(dataList.get(position).getImg_id());
		holder.bt.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				new AlertDialog.Builder(context).setTitle("系統提示")//設定對話框标題  				  
			     .setMessage(name)//設定顯示的内容  			  
			     .setPositiveButton("确定",new DialogInterface.OnClickListener() {//添加确定按鈕  			  			          			  
			         @Override  			  
			         public void onClick(DialogInterface dialog, int which) {//确定按鈕的響應事件  		  
			             // TODO Auto-generated method stub  		  			  
			         }  		  
			     }).show();//在按鍵響應事件中顯示此對話框  
			}
		});
		return convertView;
	}

	
	static class ViewHolder {
		public TextView name;
		public ImageView image;
		public Button bt;
	}           

4.在activity上給listview加載資料

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
	android:background="#000000"
     >

	<ListView 
	    android:id="@+id/lv"
		android:layout_width="match_parent"
	    android:layout_height="match_parent">
	    
	</ListView>

</RelativeLayout>           
public class MainActivity extends Activity {
	private List<Data> dataList;
	private int[] img_id = {R.drawable.coffee1,R.drawable.coffee2,
			R.drawable.coffee3,R.drawable.coffee4,R.drawable.coffee5};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//初始化資料
		dataList = new ArrayList<Data>();
		for(int i=0;i<img_id.length;i++){
			int img = img_id[i];
			String name = this.getResources().getString(R.string.coffee) + i;
			Data data = new Data(img, name);
			dataList.add(data);
		}
		
        // 建立一個自定義Adapter
        Adapter adapter = new Adapter(MainActivity.this,R.layout.list_item, 
        		 new int[]{R.id.img, R.id.name, R.id.bt}, dataList);
        ListView list = (ListView) findViewById(R.id.lv);
        // 為ListView設定Adapter
        list.setAdapter(adapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}           

5.最後實作的效果和點選button的效果

Android自定義adapter的listview
Android自定義adapter的listview

自定義adapter已經完成,這也是adapter的一個模闆,具體代碼http://download.csdn.net/detail/qq_29955091/9553940