Android ListView的addHeaderView與addFooterView的詳解

在Android開發中ListView是一個使用廣泛的控件,ListView在開發中和其它組件組合起來可以做出一系列優美的效果!今天主要隨意寫寫,ListView中的addHearView()和addFooterView()在使用中應該注意的一些問題。

    1.addHeaderView()的功能是在ListView的頭部添加一個佈局,它可以重複添加多個佈局。同理,addFooterView()是在ListView的底部添加一個佈局。但是在添加布局的時候它是從父容器開始添加的,而不可以單獨添加某個父容器中的某個子控件。比如:你可能只是單獨添加一個ImageView在ListView的頂部展示一張圖片。那麼你也只能單獨寫個xml佈局裏面就放個ImageView,然後將整個View添加進去。或者說:你就只要添加一個空白的View放上面佔個位置,你也不能省事。你還是得這樣寫:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        
        <View
            android:layout_width="match_parent"
            android:layout_height="50dp"/>
     
    </LinearLayout>

    View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.head_view_layout, null);
    mListView.addHeaderView(view);

     2.在addHeaderView()與addFooterView()時,它們各有一個重載方法addHeaderView(View v,Object data,boolean isSelectable)與addFooterView(View v,Object data,boolean isSelectable)。它們相對應addHeaderView()與addFooterView而言,主要在於最後一個參數isSelectable可以控制你添加進去的View是否可以被selected.

     3.在addHeaderView()與addFooterView()時,它們必須在你setAdapter()之前就添加進去,這樣才能綁定頭部或尾部,不然會報錯!這是因爲在調用setAdapter()的時候,android會判斷是否添加了頭部或者尾部,如果你添加了,它會生成一個新的tempadapter,這個新的tempadapter包含了我們設置的適配器所有的內容,包括了添加的headerView和footerView。所以當我們再給ListView添加了header或footer後在程序中調用ListView.setAdapter時返回的tempAdapter就不是我們setAdapter()進去的adapter了。在添加了header後,我們的adapter的position雖然是從0開始計算的,但是0的位置已經被header佔用了,所以在調用public void onItemClick(AdapterView<?> parent,View view,int position,long id)這個方法的時候,我們ListView的點擊事件取值時,position-1時才能取到正確的值。

     4.在ListView的item中如果有Button,CheckBox等控件時,item的焦點會被裏面的Button,CheckBox等搶走,造成item點擊事件失效的情況。這種情況的解決方案就是要麼你把裏面的這種搶焦點的控件,換成ImageView這種不搶焦點的控件去實現相同的效果。要麼setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);這樣就能阻塞子控件搶佔焦點,item能觸發點擊事件,裏面的Button,Checkbox也能觸發各自的點擊事件。

     5.在我們實際開發中,一般我們都是先setAdapter()然後在removexxx()相應的控件,尤其是在動態添加和刪除的時候。不然會出現出現空指針異常。可能你會覺得很奇怪,爲啥我的ListView的數據不爲空,它會出現空指針異常!這是因爲ListView它是分成三部分的,頭部,中間,尾部;其中要有中間才能真正意義上的生效,如果,中間部分沒有設置進去還沒生效,你就進行移除它肯定會出去空指針的。在移除前一定要記得setAdapter(),adapter 不能爲null。
---------------------
作者:丶鹹魚
來源:CSDN
原文:https://blog.csdn.net/richardli1228/article/details/48551639
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章