前言
最近做显示音乐列表信息时,发现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>
参考文章
© 版权声明