今天在作項目的時候用了自定義listview以及自定義的item、adapter。如今把其中須要注意的地方記錄下來:android
一、item內若是有button等控件時,在監聽listview的onitemclick事件時,焦點會被item內的button、imagebutton等控件搶走,從而致使在listview設置了onitemclick事件後不會被觸發。解決方法是在初始化item的時候屏蔽掉其內部button等控件的焦點獲取,具體方法能夠在自定義item的根控件中調用:
ide
setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
spa
這樣就能阻塞字控件搶奪焦點,listview的onitemclick就能被正確觸發,同時對item內部的button等控件也沒有影響,他們在被點擊時照樣能夠觸發自身的點擊事件。事件
二、當listview須要添加headerview時,能夠經過調用listview的addHeaderView(headView, null, false) 方法,該方法還有一個重載方法 addHeaderView(headView);這兩個方法的區別是前一個方法能夠控制header是否能夠被selected,若是不想被selected則將第三個參數設置成false;get
三、接着上面說的添加header,添加header時調用的addHeaderView方法必須放在listview.setadapter前面,意思很明確就是若是想給listview添加頭部則必須在給其綁定adapter前添加,不然會報錯。緣由是當咱們在調用setAdapter方法時會android會判斷當前listview是否已經添加header,若是已經添加則會生成一個新的HeaderViewListAdapter,這個新的HeaderViewListAdapter包含咱們設置的adapter全部內容以及listview的header和footer。因此當咱們在給listview添加了header後在程序中調用listview.getadapter時返回的是tempadapter而不是咱們經過setadapter傳進去的adapter。若是沒有設置adapter則HeaderViewListAdapter與咱們本身的adapter是同樣的。listview.getadapter().getcount()方法返回值會比咱們預期的要大,緣由是添加了header。it
四、接着上面的HeaderViewListAdapter說,咱們自定義adapter裏面的getitem方法裏面返回的position是不包括header的,是咱們自定義adapter中數據position編號從0開始,也就是說與咱們傳進去的list的位置是同樣的。
io
@Override
cli
public View getView(int position, View convertView, ViewGroup parent) {
List
// TODO Auto-generated method stub
select
Log.i("adapter", "position:"+position); //這個position就是咱們數據的真實位置
}
而listview的onitemclick方法中:
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
position是當前click的位置,這個位置是指在HeaderViewListAdapter中的位置,從0開始若是listview中添加了header則0表明header。