android listview addHe…

今天在做項目的時候用了自定義listview以及自定義的item、adapter。現在把其中需要注意的地方記錄下來:

1、item內如果有button等控件時,在監聽listview的onitemclick事件時,焦點會被item內的button、imagebutton等控件搶走,從而導致在listview設置了onitemclick事件後不會被觸發。解決方法是在初始化item的時候屏蔽掉其內部button等控件的焦點獲取,具體方法可以在自定義item的根控件中調用:

 

[java] view plaincopy
  1. setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);   


 

這樣就能阻塞字控件搶奪焦點,listview的onitemclick就能被正確觸發,同時對item內部的button等控件也沒有影響,他們在被點擊時照樣可以觸發自身的點擊事件。

2、當listview需要添加headerview時,可以通過調用listview的addHeaderView(headView, null, false) 方法,該方法還有一個重載方法 addHeaderView(headView);這兩個方法的區別是前一個方法可以控制header是否可以被selected,如果不想被selected則將第三個參數設置成false;

3、接着上面說的添加header,添加header時調用的addHeaderView方法必須放在listview.setadapter前面,意思很明確就是如果想給listview添加頭部則必須在給其綁定adapter前添加,否則會報錯。原因是當我們在調用setAdapter方法時會android會判斷當前listview是否已經添加header,如果已經添加則會生成一個新的tempadapter,這個新的tempadapter包含我們設置的adapter所有內容以及listview的header和footer。所以當我們在給listview添加了header後在程序中調用listview.getadapter時返回的是tempadapter而不是我們通過setadapter傳進去的adapter。如果沒有設置adapter則tempadapter與我們自己的adapter是一樣的。listview.getadapter().getcount()方法返回值會比我們預期的要大,原因是添加了header。

4、接着上面的tempadapter說,我們自定義adapter裏面的getitem方法裏面返回的position是不包括header的,是我們自定義adapter中數據position編號從0開始,也就是說與我們傳進去的list的位置是一樣的。

 

[java] view plaincopy
  1. @Override  
  2. public View getView(int position, View convertView, ViewGroup parent) {  
  3. // TODO Auto-generated method stub  
  4. Log.i("adapter""position:"+position);   //這個position就是我們數據的真實位置  
  5.   }  

 

而listview的onitemclick方法中:

 

[java] view plaincopy
  1. public void onItemClick(AdapterView
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章