我膨胀这个视图,并将其作为标题添加到我的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页眉和页脚是如何实现的.它们是一个技巧:当您将第一个页眉或页脚添加到ListView时,ListAdapter将包装在HeaderViewListAdapter中(发生在
line 270 of ListView.java). HeaderListViewAdapter是一个列表适配器,可以调整计数和位置值以包含页眉和页脚;页眉和页脚成为系统为您管理的正常列表项.
如果查看line 207 of HeaderListViewAdapter.java,您会看到getView实现在添加页眉或页脚时忽略父视图.这样做的结果是它的mLayoutParams没有从XML初始化(无法真正指向源代码,只是我随着时间的推移发现的东西).
如果你接着调用getView一段时间,过了line 2237 of AbsListView.java,然后按一下seekView的调用并搜索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 />您在< FrameLayout />内的XML.保持LinearLayout上的500dp并使FrameLayout的布局高度为WRAP_CONTENT(无论如何都会被忽略).