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 (发生在ListView.java的第270行 )。 HeaderListViewAdapter是一个列表适配器,调整countposition值以包含页眉和页脚; 页眉和页脚成为系统为您pipe理的正常列表项目。

如果查看HeaderListViewAdapter.java的第207行 ,您将看到在添加页眉或页脚时, getView实现会忽略parent视图。 这有一个效果,它的mLayoutParams不会从XML初始化(不能真正指出你的源代码,只是我发现了一段时间)。

如果你继续调用getView ,过去是AbsListView.java的第2237行 ,然后跟随调用obtainView ,并searchLayoutParams (这就是我刚刚做的),最后在ListView的第1182行。 java 。 在这里你可以看到,如果在测量子视图时布局参数为null ,它会调用generateDefaultLayoutParams() ,它在AbsListView.java的第6065行上实现 :

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

…这是你的WRAP_CONTENT来自哪里。

作为一个简单的解决方法,只需在<FrameLayout/>包装XML的<LinearLayout/> <FrameLayout/> 。 在LinearLayout上保留500dp,并使FrameLayout具有WRAP_CONTENT的布局高度(无论如何将被忽略)。