笔友城堡 - 可定义的个人主页

前言

最近做显示音乐列表信息时,发现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>

参考文章

  1. ListView 行高设置不起作用
  2. Android ListView 中 item 设置固定高度无效

相关文章

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...