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);//看个人情况
  }

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

时间: 2024-08-03 11:34:14

Android - 动态调整ListView高度的相关文章

05---MVC模式下动态调整Cell高度三部曲

动态调整Cell高度三部曲 我们在做项目开发的过程中经常会遇到每一个cell的高度及cell的子控件的显示个数不同,以我最近开发的微格为例,讲解一下MVC模式动态的调整Cell宽高的三部曲 1>.自定义Cell,重写- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier方法 在此方法中添加所有的可能显示的子控件 子控件的frame通过构建的cellFrame模型进行设置

iOS 动态调整tableViewCell 高度

效果图: 分析:从plist文件中读取数据源,plist最外层是一个Array,Array中存放的是字典,每个字典存放的key值并不完全相同. 一.单元格复用问题 1.首先读取数据源,建立数据模型,这里我只创建了一个数据模型,包含plist中所有的key值所对应的属性. 2.创建tableView,同时定制Cell, 根据category,可以分成四种单元格,在tableView创建单元格时创建4种代码如下: 1 -(UITableViewCell *)tableView:(UITableVie

使用jQuery动态调整iframe高度,以及jQuery对dom元素的监听

大家可能会遇到子页面内容较多但iframe高度不够的情况.给iframe设置scrolling="no"的话子页面内容显示不全,不设置又会出现滚动条从而影响美观.当我们点击不同的菜单让iframe加载不同的html文件时,iframe的高度就需要做相应的调整. 主题思路:子页面加载完成后根据具体body的高度给iframe设置一个适合的高度 情况1:各个子页面内容与高度比较固定 <script> $(function(){ $("#Frame_Content&qu

Android动态改变ListView的高度

定义一个函数将dp转换为像素 public int Dp2Px(Context context, float dp) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); } 定义函数动态控制listView的高度 public void setListViewHeightBasedOnChildren(ListView listVie

ScrollView嵌套listview 时根据内容动态设置listview高度

public static void setListViewHeightBasedOnChilds(ListView listView){ ListAdapter listAdapter = listView.getAdapter(); if(listAdapter==null){ return; } int totalHeight=0; int totalDividerHeight=0; for(int i = 0;i<listAdapter.getCount();i++){ View lis

scrollview嵌套listview时 动态设置listview高度

public class GetListViewHeight { public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0; i <

根据文字动态调整 UILabel 高度

#import <UIKit/UIKit.h> @interface UILabel (dynamicSize) -(float)resizeToFit; -(float)expectedHeight; @end #import "UILabel+dynamicSize.h" @implementation UILabel (dynamicSize) -(float)resizeToFit{ float height = [self expectedHeight]; CGR

如何实现可动态调整隐藏header的listview

需求:根据某种需要,可能需要动态调整listview的页眉页脚,譬如将header作为显示板使用. 难点:listView.addHeaderView()方法必须在setAdapter()方法前调用,否则就会抛异常.至于为什么会抛异常,查看下ListView的源代码即可发现.因此,在设置HeaderView之后又想将headerView移除或者隐藏,则需要绕很大的弯子:将adapter保存起来-移除headerView-(或者更换headerview)-再将adapter设置上去. 隐藏head

android中控制ListView宽度和高度

============问题描述============ 给listveiw填充item布局都是wrap_content,listview自身也使用wrap_content,可是实际显示效果listview宽度都是全屏,求解决办法 item布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="wrap_content