ScrollView与ListView合用(TextView多行显示时计算不正确)的问题解决
来源:互联网 发布:mac 查看下载速度 编辑:程序博客网 时间:2024/06/07 06:28
最近测试的时候发现在使用SrollView 中使用两个listView,如果使用特大字体的话,比较长的LISTVIEW多行显示会有问题。在网上搜索了一下,大概有两种解决方案,一种是重写ListView的onMeasure方法,一种是重写TextView的onMeasure方法.
一 重写ListView的onMeasure方法
首先,ListView不能直接用,要自定义一个,然后重写onMeasure()方法:
代码如下:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }
第二步:写个计算listView每个Item的方法:
代码如下:
public void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { // listAdapter.getCount()返回数据项的数目 View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); // 计算子项View 的宽高 totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度 } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); // listView.getDividerHeight()获取子项间分隔符占用的高度 // params.height最后得到整个ListView完整显示需要的高度 listView.setLayoutParams(params); }
第三步:listview添加适配器后设置高度即可:
代码如下:
listView.setAdapter(adapter);
new ListViewUtil().setListViewHeightBasedOnChildren(listView);
二 重写TextView的onMeasure方法
代码有
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- Layout layout = getLayout();
- if (layout != null) {
- int height = (int)FloatMath.ceil(getMaxLineHeight(this.getText().toString()))
- + getCompoundPaddingTop() + getCompoundPaddingBottom();
- int width = getMeasuredWidth();
- setMeasuredDimension(width, height);
- }
- }
- private float getMaxLineHeight(String str) {
- float height = 0.0f;
- float screenW = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth();
- float paddingLeft = ((LinearLayout)this.getParent()).getPaddingLeft();
- float paddingReft = ((LinearLayout)this.getParent()).getPaddingRight();
- //这里具体this.getPaint()要注意使用,要看你的TextView在什么位置,这个是拿TextView父控件的Padding的,为了更准确的算出换行
- int line = (int) Math.ceil( (this.getPaint().measureText(str)/(screenW-paddingLeft-paddingReft)));
- height = (this.getPaint().getFontMetrics().descent-this.getPaint().getFontMetrics().ascent)*line;
- return height;
- }
- 上面的代码完成更能为,在ListView开始测量时,测量到TextView时,就调用我们的onMeasure方法,我们就可以测量字体的总宽度除与去掉边距的屏幕的大小,就可以算出文字要几行来显示,然后测量字体的高度*行数可以得到字体的总高度,然后在加上上下边距就是TextView真正的高度,然后setMeasuredDimension进去就可以计算出正确的值出来。
0 0
- ScrollView与ListView合用(TextView多行显示时计算不正确)的问题解决
- ScrollView与ListView合用(正确计算Listview的高度)的问题解决
- ScrollView与ListView合用(正确计算Listview的高度)的问题解决
- ScrollView与ListView合用(正确计算Listview的高度)的问题解决
- ScrollView与ListView合用(正确计算Listview的高度)的问题解决
- ScrollView与ListView合用(正确计算Listview的高度)的问题
- ScrollView与ListView合用问题(正确计算Listview的高度)
- ScrollView与ListView合用问题(正确计算Listview的高度)
- Android 当ScrollView里面嵌套Listview时计算高度
- 关于ScrollView中嵌套listView,textView存在多行时,listView高度计算不正确。
- scrollview下listview中的textview显示多行时,无法显示,
- ListView(ScrollView)嵌套ListView、GridView显示不全,内容大于一行计算的高度不正确的解决办法
- ScrollView嵌套ListView,显示不全的问题解决方法
- ScrollView中包含ListView显示不全的问题解决方案
- ScrollView中嵌套ListView时显示不全的问题解决办法
- ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法
- ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法
- ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法
- 最小生成树:HDU 1879继续畅通工程
- BootStrap学习笔记
- map容器使用基础
- 表空间的状态(二) - read/write
- [HDOJ 4949] Light [插头DP]
- ScrollView与ListView合用(TextView多行显示时计算不正确)的问题解决
- UIScrollView介绍
- Minimum Window Substring Java
- soapui模拟桩mockservice---发布mockservice
- Android Fragment
- mysql中的case when then,replace的用法。
- 8-18 Android学习ing
- 记ACM第一次大聚餐!
- 一个Action多个方法的调用