addHeaderView()方法:主要是向listView的頭部添加布局
addFooterView()方法:主要是向listView的底部添加布局android
須要注意的是添加布局的時候應該添加從父容器開始添加,而不能直接添加父容器中的子控件。例如:從一個xml佈局文件中添加一個button控件,
只能將整個佈局xml文件添加進去。而不能單單隻添加button控件。ide
當添加頭部和底部佈局還有另一個重載方法就是addHeaderView(headView, null, false) 和addFooterView(footerView, null, false)方法,
這個方法與上面的方法區別在於:當給listView設置點擊事件的時候,能夠控制添加的佈局是否可出發點擊事件。區別是前一個方法能夠控制header是否可
以被selected,若是不想被selected則將第三個參數設置成false;佈局
下面以addFooterView()方法爲例:
addFooterView()方法必須放在listview.setadapter前面,給listview添加頭部必須在綁定adapter前添加,不然會報錯。
緣由是當咱們在調用setAdapter方法時android會判斷當前listview是否已經添加header,若是已經添加則會生成一個
新的tempadapter,這個新的tempadapter包含咱們設置的adapter全部內容以及listview的header和footer。因此當我this
們在給listview添加了header後在程序中調用listview.getadapter時返回的是tempadapter而不是咱們經過setadapterspa
傳進去的adapter。若是沒有設置adapter則tempadapter與咱們本身的adapter是同樣的。
listview.getadapter().getcount()方法返回值會比咱們預期的要大,緣由是添加了header。
咱們自定義adapter裏面的getitem方法裏面返回的position是不包括header的,是咱們自定義adapter中數據position編號從0開始,
也就是說與咱們傳進去的list的位置是同樣的。
而Activity中listview的onitemclick方法:
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3)
arg2是當前click的位置,這個位置是指在tempadapter中的位置,從0開始若是listview中添加了header則0表明header。
也就是說當咱們在使用點擊事件時,listView列中的位置爲arg2-1
通常在開發中,爲了達到咱們想要的動態添加的效果主要的作法是:在listview.setadapter以前添加所須要的控件,而後使用removeFooterView()方法移除控件。
在這裏須要注意的是,每對listView的動態操做都要進行一次removeFooterView()方法移除控件。不然listView會自動添加空白行,從而影響顯示的效果。
----------------------------------------------------------------------------------------------指針
android listview addHeaderView和addFooterView的注意事項 :xml
一、item 內若是有button等控件時,在監聽listview的onitemclick事件時,焦點會被item內的button、imagebutton等控 件搶走,
從而致使在listview設置了onitemclick事件後不會被觸發。解決方法是在初始化item的時候屏蔽掉其內部button等控件的 焦點獲取,
具體方法能夠在自定義item的根控件中調用:事件
setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
這樣就能阻塞字控件搶奪焦點,listview的onitemclick就能被正確觸發,同時對item內部的button等控件也沒有影響,他們在被點擊時照樣能夠觸發自身的點擊事件。
二、當listview須要添加headerview時,能夠經過調 用listview的addHeaderView(headView, null, false) 方法,
該方法還有一個重載方法 addHeaderView(headView);這兩個方法的區別是前一個方法能夠控制header是否能夠被selected,若是不想被 selected則將第三個參數設置成false
三、接着上面說的添加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。開發
四、接着上面的HeaderViewListAdapter說,咱們 自定義adapter裏面的getitem方法裏面返回的position是不包括header的,是咱們自定義adapter中數據position編 號從0開始,也就是說與咱們傳進去的list的位置是同樣的。rem
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
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。四、接着上面的HeaderViewListAdapter說,咱們 自定義adapter裏面的getitem方法裏面返回的position是不包括header的,是咱們自定義adapter中數據position編 號從0開始,也就是說與咱們傳進去的list的位置是同樣的。
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
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。
關於FooterView的添加和刪除
* 3.1每次老是先remove掉FooterView
* 3.2如有需求再add上FooterView
咱們一般在加載數據時,爲了省流量不會一次性把數據所有下完,通常是分段下載。
分段下載通常會在listview最後面放一個進度條表示正在加載數據,當數據加載完時,咱們又要清除它。這時候就要注意了。
mLoadingLayout = (FrameLayout) View.inflate(this, R.layout.load, null);
listView.addFooterView(mLoadingLayout);
listView.requestFocus();
這是listview尾部添加一個進度條。
listView.removeFooterView(mLoadingLayout);
這是移除尾部的進度條。
有時候在移除時回報空指針,但listview不爲null ,mLoadingLayout也不爲null,但仍是報空指針,緣由是由於listview要分爲三部分。
一是頭部,二是中間部,三是尾部。在設置了頭部或尾部時,必需要有中間部才能真正意義上的生效。沒生效就去移除就會報空指針錯誤。
因此在
listView.removeFooterView(mLoadingLayout);時
必須先調用 listView.setAdapter(adapter);(設置中間部)
adapter能夠數據能夠爲0但不可爲null