• 欢迎访问风的记忆博客网站,如有疑问请加作者QQ或者微信联系。作者QQ:524100248,微信号:sendtion。

Android 动态设置 ListView 和 GridView 高度

Android sendtion 4年前 (2016-12-27) 2021次浏览 已收录 1个评论 扫描二维码

1 需求分析

我们可能会有这样的需求,ListView 添加了一个头部,然后头部里面有一个 ListView 或者 GridView,当你按照正常的方式给头部的 ListView 或者 GridView 设置数据的时候,发现它只能显示一行!!!这可不是我想要的。

那么怎么办呢?最直接的办法,就是在 xml 布局中给头部的 ListView 或者 GridView 设置固定的高度。虽然这样可以出来效果,但是显然不是我想要的。因为数据不能确定,高度也不会固定,设置固定高度怎么可以!!!

既然如此,那就在代码中为他们动态设置高度吧。
最重要的,也是最关键的就是怎么计算 ListView 和 GridView 的高度。

2 算法分析

ListView
要计算 ListView 的高度,很简单啊。首先,得知道有多少条数据,循环计算每一条 item 的高度,把他们相加就得出了总的高度。

GridView
要计算 GridView 的高度,方法类似,只不过要考虑到列数。比如有 12 条数据,设置为 5 列,那么就有三行数据。只要我们得到每一行的高度,然后再相加,就是我们想要的结果。

3 代码实现

ListView


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 <span class="hljs-comment">//为listview动态设置高度(有多少条目就显示多少条目) </span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setListViewHeight</span>(<span class="hljs-params">ListView listView</span>) </span>{
    <span class="hljs-comment">//获取listView的adapter  </span>
    ListAdapter listAdapter = listView.getAdapter();  
    <span class="hljs-keyword">if</span> (listAdapter == <span class="hljs-keyword">null</span>) {  
        <span class="hljs-keyword">return</span>;  
    }
    <span class="hljs-keyword">int</span> totalHeight = <span class="hljs-number">0</span>;  
    <span class="hljs-comment">//listAdapter.getCount()返回数据项的数目  </span>
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>,len = listAdapter.getCount(); i &lt; len; i++) {  
        View listItem = listAdapter.getView(i, <span class="hljs-keyword">null</span>, listView);
        listItem.measure(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>);  
        totalHeight += listItem.getMeasuredHeight();  
    }  
    <span class="hljs-comment">// listView.getDividerHeight()获取子项间分隔符占用的高度 </span>
    <span class="hljs-comment">// params.height最后得到整个ListView完整显示需要的高度  </span>
    ViewGroup.LayoutParams <span class="hljs-keyword">params</span> = listView.getLayoutParams();  
    <span class="hljs-keyword">params</span>.height = totalHeight + (listView.getDividerHeight() *  (listAdapter .getCount() - <span class="hljs-number">1</span>));  
    listView.setLayoutParams(<span class="hljs-keyword">params</span>);
}

//使用方式,必须刷新 Adapter


1
2
<span class="hljs-built_in">set</span>ListViewHeight(listView);
listViewAdapter.notifyDataSetChanged();

GridView


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setGridViewHeight</span>(<span class="hljs-params">GridView gridview</span>) </span>{  
    <span class="hljs-comment">// 获取gridview的adapter  </span>
    ListAdapter listAdapter = gridview.getAdapter();  
    <span class="hljs-keyword">if</span> (listAdapter == <span class="hljs-keyword">null</span>) {  
        <span class="hljs-keyword">return</span>;  
    }  
    <span class="hljs-comment">// 固定列宽,有多少列  </span>
    <span class="hljs-keyword">int</span> numColumns= gridview.getNumColumns(); <span class="hljs-comment">//5  </span>
    <span class="hljs-keyword">int</span> totalHeight = <span class="hljs-number">0</span>;  
    <span class="hljs-comment">// 计算每一列的高度之和 </span>
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; listAdapter.getCount(); i += numColumns) {  
        <span class="hljs-comment">// 获取gridview的每一个item  </span>
        View listItem = listAdapter.getView(i, <span class="hljs-keyword">null</span>, gridview);
        listItem.measure(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>);  
        <span class="hljs-comment">// 获取item的高度和  </span>
        totalHeight += listItem.getMeasuredHeight();  
    }  
    <span class="hljs-comment">// 获取gridview的布局参数  </span>
    ViewGroup.LayoutParams <span class="hljs-keyword">params</span> = listView.getLayoutParams();  
    <span class="hljs-keyword">params</span>.height = totalHeight;  
    gridview.setLayoutParams(<span class="hljs-keyword">params</span>);  
}

//使用方式,必须刷新 Adapter


1
2
<span class="hljs-built_in">set</span>GridViewHeight(gridView);
gridViewAdapter.notifyDataSetChanged();

如有疑问,欢迎指正!

个人简介


风的记忆 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Android 动态设置 ListView 和 GridView 高度
喜欢 (2)
[sendtion@126.com]
分享 (0)
sendtion
关于作者:
一个不断奋斗追逐梦想的少年~
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 挺好的,感谢博主的分享。
    凯哥自媒体2016-12-30 16:34 回复 未知操作系统 | 未知浏览器