標籤:
2. 代碼
MainActivity
package com.himi;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;public class MainActivity extends Activity {private SimpleAdapter adapter;// 聲明配接器物件private ListView listView; // 聲明列表視圖對象private List < Map < String , Object >> list;// 聲明列表容器public static MainActivity ma;@ Overridepublic void onCreate ( Bundle savedInstanceState ) {super.onCreate ( savedInstanceState );ma = this;// 執行個體化列表容器list = new ArrayList < Map < String , Object >> ( );listView = new ListView ( this );// 執行個體化列表視圖// 執行個體一個列表資料容器Map < String , Object > map = new HashMap < String , Object > ( );// 往列表容器中添加資料map.put ( "item1_imageivew" , R.drawable.icon );map.put ( "item1_bigtv" , "BIGTV" );map.put ( "item1_smalltv" , "SMALLTV" );// 將列表資料添加到列表容器中list.add ( map );// 使用Android 提供的SimpleAdapter適配器,無法實現組件監聽;// adapter = new SimpleAdapter(this, list, R.layout.main,// new String[] {"item1_imageivew", "item1_bigtv", "item1_smalltv" },// new int[] {R.id.iv, R.id.bigtv, R.id.smalltv });// --使用自訂配接器,可監聽其ListView中每一項的事件監聽MySimpleAdapter adapter = new MySimpleAdapter ( this , list , R.layout.main , new String [ ] { "item1_imageivew" , "item1_bigtv" , "item1_smalltv" } , new int [ ] { R.id.iv , R.id.bigtv , R.id.smalltv } );// 為列表視圖設定適配器(將資料對應到列表視圖中)listView.setAdapter ( adapter );listView.setOnItemClickListener ( new OnItemClickListener ( ) {@ Overridepublic void onItemClick ( AdapterView < ? > parent , View view , int position , long id ) {// TODO Auto-generated method stubToast.makeText ( MainActivity.this , "你點擊的是第:" + position + "項" , Toast.LENGTH_SHORT ) .show ( );}} );// //顯示列表視圖this.setContentView ( listView );}}
MySimpleAdapter
package com.himi;import java.util.List;import java.util.Map;import android.app.AlertDialog;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.ImageView;import android.widget.TextView;import android.widget.CompoundButton.OnCheckedChangeListener;public class MySimpleAdapter extends BaseAdapter {//聲明一個LayoutInflater對象(其作用是用來執行個體化布局)private LayoutInflater mInflater;private List < Map < String , Object >> list;//聲明List容器物件private int layoutID; //聲明布局IDprivate String flag[];//聲明ListView項中所有組件映射索引private int ItemIDs[];//聲明ListView項中所有組件ID數組public MySimpleAdapter ( Context context , List < Map < String , Object >> list , int layoutID , String flag[] , int ItemIDs[] ) {//利用構造來執行個體化成員變數對象this.mInflater = LayoutInflater.from ( context );this.list = list;this.layoutID = layoutID;this.flag = flag;this.ItemIDs = ItemIDs;}@ Overridepublic int getCount ( ) {return list.size ( );//返回ListView項的長度}@ Overridepublic Object getItem ( int arg0 ) {return 0;}@ Overridepublic long getItemId ( int arg0 ) {return 0;}//執行個體化布局與組件以及設定組件資料//getView(int position, View convertView, ViewGroup parent)//第一個參數:繪製的行數//第二個參數:繪製的視圖這裡指的是ListView中每一項的布局//第三個參數:view的合集,這裡不需要@ Overridepublic View getView ( int position , View convertView , ViewGroup parent ) {//將布局通過mInflater對象執行個體化為一個viewconvertView = mInflater.inflate ( layoutID , null );for ( int i = 0 ; i < flag.length ; i ++ ) {//遍曆每一項的所有組件//每個組件都做匹配判斷,得到組件的正確類型if (convertView.findViewById ( ItemIDs [ i ] ) instanceof ImageView) {//findViewById()函數作用是執行個體化布局中的組件//當組件為ImageView類型,則為其執行個體化一個ImageView對象ImageView iv = ( ImageView ) convertView .findViewById ( ItemIDs [ i ] );//為其組件設定資料iv.setBackgroundResource ( ( Integer ) list .get ( position ) .get ( flag [ i ] ) );}else if (convertView.findViewById ( ItemIDs [ i ] ) instanceof TextView) {//當組件為TextView類型,則為其執行個體化一個TextView對象TextView tv = ( TextView ) convertView .findViewById ( ItemIDs [ i ] );//為其組件設定資料tv.setText ( ( String ) list.get ( position ) .get ( flag [ i ] ) );}}//為按鈕設定監聽( ( Button ) convertView.findViewById ( R.id.btn ) ) .setOnClickListener ( new View.OnClickListener ( ) { @ Override public void onClick ( View v ) { //這裡彈出一個對話方塊,後文有詳細講述 new AlertDialog.Builder ( MainActivity.ma ) .setTitle ( "自訂SimpleAdapter" ) .setMessage ( "按鈕成功觸發監聽事件!" ) .show ( ); } } );//為複選框設定監聽( ( CheckBox ) convertView.findViewById ( R.id.cb ) ) .setOnCheckedChangeListener ( new OnCheckedChangeListener ( ) { @ Override public void onCheckedChanged ( CompoundButton buttonView , boolean isChecked ) { //這裡彈出一個對話方塊,後文有詳細講述 new AlertDialog.Builder ( MainActivity.ma ) .setTitle ( "自訂SimpleAdapter" ) .setMessage ( "CheckBox成功觸發狀態改變監聽事件!" ) .show ( ); } } );return convertView;}}
Layout
<?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" > <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/bigtv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" /> <TextView android:id="@+id/smalltv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="10sp" /> </LinearLayout> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" android:text="button" /> <CheckBox android:id="@+id/cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" /></LinearLayout>
Android -- ListView(SimpleAdapter) 自訂配接器