ListView标头忽略layout_height

时间:2014-09-12 15:17:57

标签: android listview layout

我对此视图进行了充气,​​并将其作为标题添加到我的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不尊重其标题的authoritah并将其包含在其内容中。有人可以解释一下会发生什么吗?

1 个答案:

答案 0 :(得分:14)

了解正在发生的事情的关键是弄清楚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(这是null我刚刚做了什么)你最终在line 1182 of ListView.java。在这里,您可以看到,如果在测量子视图时布局参数为generateDefaultLayoutParams(),则会调用@Override protected ViewGroup.LayoutParams generateDefaultLayoutParams() { return new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0); } WRAP_CONTENT,该<LinearLayout/>line 6065 of AbsListView.java上实现:

<FrameLayout/>

......以及{{1}}来自的地方。

作为一种简单的解决方法,只需将{{1}} XML包装在{{1}}中。保持LinearLayout上的500dp并使FrameLayout的布局高度为WRAP_CONTENT(无论如何都会被忽略)。

相关问题