2014-09-12 56 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