1. 程式人生 > >舉例說明ArrayAdapter的使用和如何設定ListView中每個Item的點選事件

舉例說明ArrayAdapter的使用和如何設定ListView中每個Item的點選事件

  • 首先要先定義一個ListView物件,並進行例項化
    private ListView mListView;
    mListView=(ListView)findViewById(R.id.ListView);

  • 定義類MyAdapter繼承ArrayAdapter
    public class MyAdapter extends ArrayAdapter<String>{
    		int [] indexs=null;//索引整型陣列
    		String[] labels=null;//標籤字串陣列
    		int[] results=null;//結果整型陣列
    		
    		public MyAdapter(Context context,int resId,int txtResId,String[] arr,String[] ixs){
    			//建構函式就是進行一些初始化工作
    			//MyAdapter的建構函式傳入的引數有很多種可能
    			//resId是name的資源id,txtResId是index的資源id,arr是儲存name的字串陣列,ixs是儲存index的字串陣列
    			super(context,resId,txtResId,arr);//父類(超類)中沒有第五個引數
    			labels=arr;
    			int len=labels.length;//取標籤字串陣列的長度
    			results=new int[len];
    			indexs=new int[len];//給結果陣列和索引陣列進行例項化,長度都設定為標籤陣列的長度
    			for(int i=0;i<len;i++){//對結果陣列和索引陣列中的資料進行初始化
    				results[i]=0;
    				indexs[i]=EMODE_ARRAY.valueOf(ixs[i]).ordinal();//這裡求名稱為ixs[i]的列舉型別的序數
    				//EMODE_ARRAY是一個列舉型別,定義在類的前面
    			}
    		}
    		
    		public View getView(int pos,View v,ViewGroup parent){//這是繼承ArrayAdapter<String>需要重寫的方法,是對ListView中的每一個Item進行操作的方法
    			if(v==null){
    				v=inflater.inflate(R.layout.em_menu_item, null);//em_menu_item是選單中每個單項的顯示檢視,裡面包括一個TextView和一個ImageView
    			}
    			((TextView)v.findViewById(R.id.txt)).setText(labels[pos]);//TextView儲存的是相應位置上的name,pos是每個item的索引(序數)
    			ImageView img=(ImageView)v.findViewById(R.id.img);//ImageView儲存的是測試的結果點陣圖
    			if(results[pos]==1){//result陣列值的改變應該是在每個測試項中進行的
    				img.setImageBitmap(okBm);
    			}else if(results[pos]==2){
    				img.setImageBitmap(failBm);
    			}else{
    				img.setImageBitmap(null);
    			}
    			return v;
    		}
    		
    		public void onResume(){//每次單項測試完成後回到選單列表介面的時候都會呼叫該方法
    			ContentResolver cr=getContentResolver();
    			String org_results=Settings.System.getString(cr,MatchingReceiver.IS_Telephone?"emode_pcba_results":"emode_results");
    			//這裡針對Settings匯入的包是android.provider.Settings,emode_pcba_result和emode_results應該是這裡面的內容
    			//應該是每個單項測試完成後都會把資料儲存在上面提到的內容中
    			rg_results!=null){//測試結果不為空
    				String[] pairs=org_results.split(",");//將儲存的字串根據,分割形成一個字串陣列
    				String[] tp;
    				int len=results.length;//len表示測試結果的長度
    				int s=pairs.length;//s表示測試結果中根據,分割後的陣列長度
    				for(int i=0;i<len;i++){
    					for(int j=0;j<s;j++){
    						tp=pairs[j].split("=");//把根據,分割的字串陣列再根據=分割形成字串陣列
    						if(indexs[i]==Integer.parseInt(tp[0])){//如果每一項結果的索引值和儲存的結果相同
    							results[i]=Integer.parseInt(tp[1]);//就給該項的結果賦值,同時將字串形式的值轉換為整型
    						}
    					}
    				}
    				notifyDataSetChanged();//通知資料發生了變化
    				//void android.widget.ArrayAdapter.notifyDataSetChanged()該方法是ArrayAdapter自帶,用來更新改變的資料
    			}
    		}
    	}

  • 定義MyAdapter物件並例項化,同時給定義的ListView物件設定介面卡,這樣檢視中的控制元件ListView就和陣列介面卡聯絡在一起了
    MyAdapter adapter=new MyAdapter(this,R.layout.em_menu_item,R.id.txt,array_all,Index_all);
    			//第一個引數是當前的上下文,第二個是ListView中每個單項的佈局檔案的id,第三個是單項的文字id,第四個是all_name字串陣列,第四個是all_index字串陣列
    mListViw.setAdapter(adapter);//mlistview是ListView物件,這裡通過setAdapter方法給它設定相應的介面卡

  • 給ListView中的每一個Item設定點選事件的處理邏輯
    mlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    				public void onItemClick(AdapterView<?> arg0,View arg1,int arg2,long arg3){
    					//arg0表示點擊發生的所在的AdapterView,arg1是在AdapterView中被點選的view,arg2表示adapter中view的位置(position),arg3表示被點選的item的行id
    					Intent intent=new Intent("android.intent.action.emode_menu");
    					intent.putExtra("com.example.Index_board", Index_board[arg2]);
    					sendBroadcast(intent);
    				}
    			});