导航号,我的单页导航
目录

前言

最近做显示音乐列表信息时,发现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 设置固定高度无效

版权声明 1、 本站名称 91易搜
2、 本站网址 https://www.91es.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权请留言
4、 本站禁止发布或转载任何违法的相关信息,如有发现请向站长举报
导航号,我的单页导航

暂无评论

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

暂无评论...