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 < 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 < 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();
如有疑问,欢迎指正!
个人简介