博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)解决ScrollView嵌套ListView或者GridView导致只显示一行的方法
阅读量:6760 次
发布时间:2019-06-26

本文共 3666 字,大约阅读时间需要 12 分钟。

即动态获取ListView和GridView的高度

一、对于ListView

ListView listview= new ListView(this);

setListViewHeightBasedOnChildren(listview);即可

1 public static void setListViewHeightBasedOnChildren(ListView listView) { 2                     // 获取ListView对应的Adapter 3                     ListAdapter listAdapter = listView.getAdapter(); 4                     if (listAdapter == null) { 5                             // pre-condition 6                             return; 7                     } 8        9                     int totalHeight = 0;10                     for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目11                             View listItem = listAdapter.getView(i, null, listView);12                             listItem.measure(0, 0); // 计算子项View 的宽高13                             totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度14                     }15       16                     ViewGroup.LayoutParams params = listView.getLayoutParams();17                     params.height = totalHeight18                                     + (listView.getDividerHeight() * (listAdapter.getCount() - 1));19                     // listView.getDividerHeight()获取子项间分隔符占用的高度20                     // params.height最后得到整个ListView完整显示需要的高度21                     listView.setLayoutParams(params);22             }

 

二、对于GridView

GridView gridview = new GridView(this);

setGridViewHeightBasedOnChildren(gridview );即可

1 public static void setGridViewHeightBasedOnChildren(GridView gridView) { 2                     // 获取GridView对应的Adapter 3                     ListAdapter listAdapter = gridView.getAdapter(); 4                     if (listAdapter == null) { 5                             return; 6                     } 7                     int rows; 8                     int columns=0; 9                     int horizontalBorderHeight=0;10                     Class
clazz=gridView.getClass();11 try {12 //利用反射,取得每行显示的个数13 Field column=clazz.getDeclaredField("mRequestedNumColumns");14 column.setAccessible(true);15 columns=(Integer)column.get(gridView);16 //利用反射,取得横向分割线高度17 Field horizontalSpacing=clazz.getDeclaredField("mRequestedHorizontalSpacing");18 horizontalSpacing.setAccessible(true);19 horizontalBorderHeight=(Integer)horizontalSpacing.get(gridView);20 } catch (Exception e) {21 // TODO: handle exception22 e.printStackTrace();23 }24 //判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行25 if(listAdapter.getCount()%columns>0){26 rows=listAdapter.getCount()/columns+1;27 }else {28 rows=listAdapter.getCount()/columns;29 }30 int totalHeight = 0;31 for (int i = 0; i < rows; i++) { //只计算每项高度*行数32 View listItem = listAdapter.getView(i, null, gridView);33 listItem.measure(0, 0); // 计算子项View 的宽高34 totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度35 }36 ViewGroup.LayoutParams params = gridView.getLayoutParams();37 params.height = totalHeight+horizontalBorderHeight*(rows-1);//最后加上分割线总高度38 gridView.setLayoutParams(params);39 }

 

转载地址:http://ilfeo.baihongyu.com/

你可能感兴趣的文章
CSS3实现多样的边框效果
查看>>
linux之错误输出重定向
查看>>
amazeui学习笔记--css(常用组件12)--面板Panel
查看>>
IOC框架之Ninject 简介
查看>>
[转]Reporting Services 中的身份验证类型
查看>>
【转】Centos7安装nodejs
查看>>
SQL Server扩展事件的使用ring_buffer target时“丢失”事件的原因分析以及ring_buffer target潜在的问题...
查看>>
python MLP 神经网络使用 MinMaxScaler 没有 StandardScaler效果好
查看>>
实现html转png
查看>>
python对于0x01的处理
查看>>
jitwatch查看JIT后的汇编码
查看>>
「移动开发云端新模式探索实践」征文活动
查看>>
caffe RandomOrderChannels
查看>>
史莱姆自爆问题
查看>>
MAC 设置环境变量path的几种方法
查看>>
安装部署elasticsearch
查看>>
Bluefish
查看>>
centos 安装cmake 3.3.2
查看>>
ubuntu gitlab服务器搭建
查看>>
文本文件里如何快速在每行头尾都加上指定的内容
查看>>