Заголовок ListView игнорирует layout_height

Я раздуваю это представление и добавляю его в свой ListView как заголовок. Я пытаюсь сделать его 500dp высоким (жесткий код, ради этого примера)

<?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 не уважает авторитет своего заголовка и обертывает его на свой контент. Может ли кто-нибудь объяснить, что происходит?

Solutions Collecting From Web of "Заголовок ListView игнорирует layout_height"

Ключ, чтобы понять, что происходит, – это выяснить, как реализованы верхние и нижние колонтитулы ListView. Это трюк: в тот момент, когда вы добавляете первый заголовок или нижний колонтитул в свой ListView, ваш ListAdapter завершается в HeaderViewListAdapter (происходит в строке 270 ListView.java ). HeaderListViewAdapter – это адаптер списка, который настраивает значения count и position для включения верхних и нижних колонтитулов; Верхние и нижние колонтитулы становятся обычными элементами списка, которыми система управляет для вас.

Если вы посмотрите на строку 207 HeaderListViewAdapter.java , вы увидите, что реализация getView игнорирует parent представление при добавлении верхнего или getView колонтитула. Это приводит к тому, что его mLayoutParams не инициализируется из XML (на самом деле не может указывать на исходный код, что-то, что я обнаружил с течением времени).

Если вы затем выполните вызовы getView немного, в строке 2237 из AbsListView.java и следуйте за вызовами для obtainView для бит и LayoutParams поиск LayoutParams (это то, что я только что сделал), вы LayoutParams в строку 1182 ListView. Java . Здесь вы видите, что если параметры макета равны null при измерении дочернего представления, он вызывает функцию generateDefaultLayoutParams() , которая реализована в строке 6065 из 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/> . Держите 500dp на LinearLayout и сделайте FrameLayout иметь высоту макета WRAP_CONTENT (которая в любом случае будет проигнорирована).