前言
最近做显示音乐列表信息时,发现ListView的Item布局中固定的高度失效了,怎么设置这个高度都失效。
参考网用和自己折腾过程,记录一下,防止下次忘记。
总结
整理一下原因:
1. LayoutInflater.inflate(int resource, ViewGroup root) 2. LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot) 第一个方法没有应用xml中的属性到布局中,只刷新子布局或者子控件的最高高度。
具体还是看一下源码中的注释。
虽然有下面三种解决方式,但我个人还是喜欢使用第一种方式。
LayoutInflater.inflate(R.layout.list_item_layout, parent, false);
正文
先上我测试中的代码片段,看看你是否跟我写的一样,也存在这样的问题。
Demo代码片段
MediaAdapter.java
public class MediaAdapter extends BaseAdapter {
private ViewHolder mViewHolder = null;
private LayoutInflater mLayoutInflater = null;
public MediaAdapter(Context context) {
mLayoutInflater = LayoutInflater.from(context);
}
//......[省略]
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (null != convertView) {
mViewHolder = (ViewHolder) convertView.getTag();
} else {
mViewHolder = new ViewHolder();
//修改点一
convertView = mLayoutInflater.inflate(R.layout.list_item_layout, null);
convertView.setTag(mViewHolder);
}
return convertView;
}
private class ViewHolder {
private TextView mTvName = null;
private ImageView mIvLike = null;
}
}
list_item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
//修改点二
android:layout_height="94dp">
//......[省略]
</RelativeLayout>
PS:上面的两处[修改点一][修改点二]都是下面要用的,这里只是打个tag。
解决方法
解决上面这个问题有三种方式,但其中一种方式是最有效的,其他两种只是作为规避问题而已。
PS:方法一是个人觉得最有效的
方法一
该方法就是把MediaAdapter.java中的[修改点一]改为如下:
//convertView = mLayoutInflater.inflate(R.layout.list_item_layout, null);
convertView = mLayoutInflater.inflate(R.layout.list_item_layout, parent, false);
这个方式是来自网用[infsafe](原文第一个链接)整理的。
原因:
因为第一种写法,layout的属性没有应用到本行
尴尬,人家2013年整理的,我们现在还在犯错。惭愧!
方法二
虽然方法一最简单,但这个问题还可以通过其他方式解决,我们继续试探其他方法。
网上有朋友说:
inflater填充布局中高度最大的那个控件的高度
这个我测试过,确实,改变布局中的控件高度,最后item的高度就是那个最高的。
因此,方法二就可以改变布局的最小高度,限定死即可。
该方法在list_item_layout.xml的[修改点二]处新增:
android:minHeight="94dp"
最终xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="94dp">
//.....省略
</RelativeLayout>
方法三
方法三和方法二的思路类似,把上面的整个布局当做子布局(控件),就可以实现,也就是外面嵌套一个布局。
具体修改后的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="94dp">
//.....省略
</RelativeLayout>
</LinearLayout>
