日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android listview addHeaderView 和 addFooterView 详解

發布時間:2023/11/29 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android listview addHeaderView 和 addFooterView 详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

addHeaderView()方法:主要是向listView的頭部添加布局
addFooterView()方法:主要是向listView的底部添加布局

需要注意的是添加布局的時候應該添加從父容器開始添加,而不能直接添加父容器中的子控件。例如:從一個xml布局文件中添加一個button控件,
只能將整個布局xml文件添加進去。而不能單單只添加button控件。

當添加頭部和底部布局還有另外一個重載方法就是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。所以當我

們在給listview添加了header后在程序中調用listview.getadapter時返回的是tempadapter而不是我們通過setadapter

傳進去的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的注意事項? :

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

?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,
如果已經添加則會生成一個新的HeaderViewListAdapter,這個新的HeaderViewListAdapter包含我們 設置的adapter所有內容以及listview的header和footer。
所以當我們在給listview添加了header后在程序中調用 listview.getadapter時返回的是tempadapter而不是我們通過setadapter傳進去的adapter。
如果沒有設置 adapter則HeaderViewListAdapter與我們自己的adapter是一樣的。 listview.getadapter().getcount()方法返回值會比我們預期的要大,原因是添加了header。

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

?

@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。4、接著上面的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

總結

以上是生活随笔為你收集整理的Android listview addHeaderView 和 addFooterView 详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。