Android 动态设置 ListView 和 GridView 高度

jiazhibin 8年前
   <h3><strong>1 需求分析</strong></h3>    <p>我们可能会有这样的需求,ListView添加了一个头部,然后头部里面有一个ListView或者GridView,当你按照正常的方式给头部的ListView或者GridView设置数据的时候,发现它只能显示一行!!!这可不是我想要的。</p>    <p>那么怎么办呢?最直接的办法,就是在xml布局中给头部的ListView或者GridView设置固定的高度。虽然这样可以出来效果,但是显然不是我想要的。因为数据不能确定,高度也不会固定,设置固定高度怎么可以!!!</p>    <p>既然如此,那就在代码中为他们动态设置高度吧。</p>    <p>最重要的,也是最关键的就是怎么计算ListView和GridView的高度。</p>    <h3><strong>2 算法分析</strong></h3>    <p><strong>ListView</strong></p>    <p>要计算ListView的高度,很简单啊。首先,得知道有多少条数据,循环计算每一条item的高度,把他们相加就得出了总的高度。</p>    <p>GridView</p>    <p>要计算GridView的高度,方法类似,只不过要考虑到列数。比如有12条数据,设置为5列,那么就有三行数据。只要我们得到每一行的高度,然后再相加,就是我们想要的结果。</p>    <h3><strong>3 代码实现</strong></h3>    <p><strong>ListView</strong></p>    <pre>  <code class="language-java">//为listview动态设置高度(有多少条目就显示多少条目)   public void setListViewHeight(ListView listView) {       //获取listView的adapter        ListAdapter listAdapter = listView.getAdapter();        if (listAdapter == null) {            return;        }       int totalHeight = 0;        //listAdapter.getCount()返回数据项的数目        for (int i = 0,len = listAdapter.getCount(); i < len; i++) {            View listItem = listAdapter.getView(i, null, listView);           listItem.measure(0, 0);            totalHeight += listItem.getMeasuredHeight();        }        // listView.getDividerHeight()获取子项间分隔符占用的高度       // params.height最后得到整个ListView完整显示需要的高度        ViewGroup.LayoutParams params = listView.getLayoutParams();        params.height = totalHeight + (listView.getDividerHeight() *  (listAdapter .getCount() - 1));        listView.setLayoutParams(params);   }</code></pre>    <p>//使用方式,必须刷新Adapter</p>    <pre>  <code class="language-java">setListViewHeight(listView);   listViewAdapter.notifyDataSetChanged();</code></pre>    <p><strong>GridView</strong></p>    <pre>  <code class="language-java">public void setGridViewHeight(GridView gridview) {        // 获取gridview的adapter        ListAdapter listAdapter = gridview.getAdapter();        if (listAdapter == null) {            return;        }        // 固定列宽,有多少列        int numColumns= gridview.getNumColumns(); //5        int totalHeight = 0;        // 计算每一列的高度之和       for (int i = 0; i < listAdapter.getCount(); i += numColumns) {            // 获取gridview的每一个item            View listItem = listAdapter.getView(i, null, gridview);           listItem.measure(0, 0);            // 获取item的高度和            totalHeight += listItem.getMeasuredHeight();        }         // 获取gridview的布局参数        ViewGroup.LayoutParams params = listView.getLayoutParams();        params.height = totalHeight;        gridview.setLayoutParams(params);    }</code></pre>    <p>//使用方式,必须刷新Adapter</p>    <pre>  <code class="language-java">setGridViewHeight(gridView);   gridViewAdapter.notifyDataSetChanged();</code></pre>    <p> </p>    <p>来自:http://www.jianshu.com/p/141ca9c140e4</p>    <p> </p>