Android ListView 添加 HeaderView后,HeaderView的布局不起作用

最近在使用ListView,发现一个奇怪的问题:当添加一个ImageView 作为HeaderView时,发现ImageView长宽始终是1:1的大小,即调用 ListView.addHeaderView(mImageView) 之后mImageView尺寸布局被忽略。具体代码如下:

list_view_header_layout.xml



mImageView = (ImageView)LayoutInflater.from(mContext).inflate(R.layout.list_view_header_layout, null);
mListView.addHeaderView(mImageView);

显示效果图如下:

Android ListView 添加 HeaderView后,HeaderView的布局不起作用_第1张图片

首先排除:addHeaderView()必须在setAdapter()之前调用,这一点我还是有注意的。

经过长时间的折腾终于找到了具体原因:

(1)下面的调用方式会使XML布局中ImageView的LayoutParam丢失

mImageView = (ImageView)LayoutInflater.from(mContext).inflate(R.layout.list_view_header_layout, null);
mListView.addHeaderView(mImageView);
修改为如下方式调用,则不会丢失 LayoutParam
mImageView = (ImageView)LayoutInflater.from(mContext).inflate(R.layout.list_view_header_layout, mListView, false);
mListView.addHeaderView(mImageView);
(2)XML布局添加adjustViewBounds


按上面的方式修改后,显示正常,效果图如下:

Android ListView 添加 HeaderView后,HeaderView的布局不起作用_第2张图片

在此介绍一下 LayoutInflater的inflate()函数的用法:

View view = inflate(int resource, ViewGroup root, boolean attachToRoot) 
resource:布局文件ID 
root:父ViewGroup对象, 
attachToRoot:是否将“渲染”出来的View添加到上面的root中 
root和attachToRoot是共同作用的: 
1,有root,同时attachToRoot为false,那么inflate()返回的就是“翻译”得到的view 
2,有root,同时attachToRoot为true,那么inflate()就是将“翻译”得到的view添加到root后,然后返回root 
3,无root,同时attachToRoot为false,那么inflate()返回的就是“翻译”得到的view
4,无root,同时attachToRoot为true,报错

root还有一个重要的作用就是为“渲染”得到的view添加合适的LayoutParam,并且如果并不想将得到的View添加到root的话,传递何种root是并没有要求的,比如: 

1. View view = mLayoutInflater.inflate(R.layout.header, new ListView(mContext), false);
2. View view = mLayoutInflater.inflate(R.layout.header, new LinearLayout(mContext), false);
3. View view = mLayoutInflater.inflate(R.layout.header, new RelativeLayout(mContext), false);
上面得到的View,除了view的LayoutParam分别为AbsListView.LayoutParams,LinearLayout.LayoutParams,RelativeLayout.LayoutParams之外,内容都一致。 

你可能感兴趣的:(Android ListView 添加 HeaderView后,HeaderView的布局不起作用)