Android - 动态调整ListView高度

布局中,如果设计ListView的高度为包裹内容,那么ListView的高度是随着它的子条目的数量的变化而改变的,

这就可能会导致ListView下面的一些控件的位置也会随着ListView的高度的变化而变化。

项目中可能会碰到需要动态调整或控制ListView的高度的情况,下面就分享一下我自己使用的一种办法。

 

我遇到的问题:

ListView下面有一个Button,如果ListView子条目的数量较少,Button可以正常显示在屏幕上,但如果ListView子条目的数量较多时,Button就会被挤出屏幕

因为考虑效果(Button要紧跟着ListView),所以不能把ListView的高度写死,所以要使用包裹内容,

那么问题就是要解决Button的显示,保证Button不被挤出屏幕

 

设计思路:

ListView子条目数量少时,下面紧跟着Button,

ListView子条目多时,Button显示在屏幕底部,ListView的高度固定到Button上方

 

解决思路:

1、先计算出固定不变的控件的高度(屏幕中有些控件的大小是不需要改变的),基本就是除了ListView以外的控件(还要考虑是否需要计算状态栏的高度)

2、获取屏幕的高度

3、用屏幕高度 减掉 固定不变的高度 得到ListView的最大允许高度

4、计算ListView每个子条目的高度并累加,得到ListView的真实高度

5、判断真实高度和最大允许高度的差值,如果真实高度超出了最大允许高度,就把ListView的高度设定为最大允许高度,否则就不需要处理

 

代码:

/**
  * 测量控件高度的方法:
  * @param view 需要测量的控件
  * @return 测量到的高度
  */

public int mesHeight(View view) {
  int width = View.MeasureSpec.makeMeasureSpec(0,
    View.MeasureSpec.UNSPECIFIED);
  int height = View.MeasureSpec.makeMeasureSpec(0,
    View.MeasureSpec.UNSPECIFIED);
  view.measure(width, height);
  return view.getMeasuredHeight();
 }

 

step1:

// 固定不变的高度自己想办法计算吧,情况不同,计算方法也不同

// 提供一些信息:有固定值的直接累加,另外如果有margintop和marginbottom属性的也要加上,没有有固定值的使用上面的方法计算

// 如果需要计算状态栏高度的,也可以在网上搜索一下,应该有很多

step2:

// 获取屏幕高度

int screenHeight = getWindowManager().getDefaultDisplay().getHeight();

step3:

screenHeight 减掉 你计算的固定高度

step4:

// ListView子条目的高度也需要自己计算,情况不同方法不同,但思路和上面的固定高度的算法思路一样

step5:

// 当前listview的总高度

int currentHeight = 0;  :
  for (int i = 0; i < lv.size(); i++) {
   currentHeight += item;
  }

if (currentHeight > maxHeight) {
   LayoutParams param = new LayoutParams(LayoutParams.FILL_PARENT,
     maxHeight);
   lv.setLayoutParams(param);
   lv.setPadding(0,0, 0,0);//看个人情况
   lv_classes.setDivider(null);//看个人情况
  }

 

方法中代码不完整,主要是因为每个项目中的布局都是不一样的,所以无法给出一个准确的计算方法,但提供的思路希望能起到帮助。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。