Android 动态设置 ListView 和 GridView 高度

1 需求分析

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

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

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


2 算法分析

ListView

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

GridView

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


3 代码实现

ListView

//为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);
}

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

setListViewHeight(listView);
listViewAdapter.notifyDataSetChanged();

GridView

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);  
}  

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

setGridViewHeight(gridView);
gridViewAdapter.notifyDataSetChanged();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值