Gle*_*ech 7 layout android listview
我膨胀这个视图,并将其作为标题添加到我的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>
Run Code Online (Sandbox Code Playgroud)
ListView不尊重其标题的authoritah并将其包含在其内容中.谁能解释一下会发生什么?
Bar*_*end 14
了解正在发生的事情的关键是弄清楚ListView页眉和页脚是如何实现的.它们是一个技巧:当你将第一个页眉或页脚添加到ListView时,ListAdapter被包装在一个HeaderViewListAdapter(发生在ListView.java的第270行).HeaderListViewAdapter是一个列表适配器,它调整count和position值以包含页眉和页脚; 页眉和页脚成为系统为您管理的正常列表项.
如果查看HeaderListViewAdapter.java的第207行,您会看到getView实现parent在添加页眉或页脚时忽略该视图.这样做的结果是它mLayoutParams不会从XML初始化(无法真正指向源代码,只是我随着时间的推移发现的东西).
如果你接着调用getView了一下,经过AbsListView.java的第2237行,然后按照要求进行obtainView搜索并搜索LayoutParams(这就是我刚刚做的),你最终会在ListView.java的第1182行.在这里你可以看到,如果布局参数null是测量子视图的时候,它会调用generateDefaultLayoutParams(),这是在AbsListView.java的第6065行实现的:
@Override
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
return new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0);
}
Run Code Online (Sandbox Code Playgroud)
......那就是你WRAP_CONTENT的来源.
作为一种简单的解决方法,只需将<LinearLayout/>XML 包装在一个<FrameLayout/>.保持LinearLayout上的500dp并使FrameLayout的布局高度为WRAP_CONTENT(无论如何都会被忽略).