0707開發備份( addHeaderView和addFooterView的注意事項)

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

[java] view plaincopy

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

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

而listview的onitemclick方法中:

[java] view plaincopy

public void onItemClick(AdapterView

headView和footerView都可以響應onItemClick方法,headView的position為0, footerView的position最大。
不過可以給headView和footerView設置OnClickListener來覆蓋OnItemClick,這樣,你點擊headview或者footerView將觸發OnClickListener而不是onItemClick().

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容