2014-09-12 85 views
7

我膨脹此視圖,並將其作爲標題添加到我的ListView中。我試圖使它500dp高(硬編碼,在這個例子的目的)ListView標題忽略layout_height

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

    <ImageView android:id="@+id/filter_menu" android:src="@drawable/ic_sort" 
       android:layout_gravity="center_vertical" android:padding="8dp" 
       android:layout_weight="0" 
       android:layout_width="wrap_content" android:layout_height="wrap_content" 
       android:onClick="showPopup"/> 

</LinearLayout> 

ListView控件不尊重其頭的authoritah並把它封裝其內容。任何人都可以解釋發生了什麼?

回答

12

瞭解發生了什麼的關鍵是弄清楚如何實現ListView頁眉和頁腳。它們是一個竅門:在將第一個頁眉或頁腳添加到ListView的那一刻,ListAdapter被包裝在HeaderViewListAdapter中(發生在line 270 of ListView.java上)。 HeaderListViewAdapter是一個列表適配器,用於調整countposition的值以包含頁眉和頁腳;頁眉和頁腳成爲系統爲您管理的正常列表項目。

如果你看看line 207 of HeaderListViewAdapter.java,你會發現當添加頁眉或頁腳時,getView實現忽略了parent視圖。這樣做的效果是它的mLayoutParams沒有從XML初始化(不能真正指向源代碼,只是我已經發現的一段時間)。

如果再遵循了一下來電getView,過去line 2237 of AbsListView.java,並按照一個位爲obtainView的電話和搜索LayoutParams(這是我只是做了),你在line 1182 of ListView.java結束。在這裏,你看到的是,如果子視圖測量時的佈局PARAMS是null,它召喚出generateDefaultLayoutParams(),這是在line 6065 of AbsListView.java實現:

@Override 
protected ViewGroup.LayoutParams generateDefaultLayoutParams() { 
    return new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
     ViewGroup.LayoutParams.WRAP_CONTENT, 0); 
} 

...而這也正是你WRAP_CONTENT是來自。

作爲一種簡單的解決方法,只需將<LinearLayout/>的XML包裝到<FrameLayout/>中即可。在LinearLayout上保留500dp,並使FrameLayout的佈局高度爲WRAP_CONTENT(無論如何都會被忽略)。

+1

+1的詳細答案。我不知道該怎麼想。錯誤 - 或功能?當事情不能按預期工作時,抽象或心智模式就會崩潰。 – 2014-09-12 16:09:35

+0

真棒,謝謝! – kiruwka 2015-01-31 20:03:50