ListView(ScrollView)嵌套ListView、GridView显示不全,内容大于一行计算的高度不正确的解决办法

原创 2016年01月13日 17:24:05

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">相信很多人都遇到过ListView或是ScrollView嵌套ListView,ListView(ScrollView)嵌套GridView,内容只显示一行,这个问题网上已有解决办法。</span>

1、对于ListView或是ScrollView嵌套ListView,一般是

利用Utility 类的静态方法setListViewHeightBasedOnChildren()即可实现:

在listview.setAdapter()之后调用Utility.setListViewHeightBasedOnChilren(listview)就能正常显示了。

public class LvHeightUtil {
	public static void setListViewHeightBasedOnChildren(ListView listView) {
		  ListAdapter listAdapter = listView.getAdapter();
		  if (listAdapter == null) {
		   return;
		  }
		  int totalHeight = 0;
		  for (int i = 0; i < listAdapter.getCount(); i++) {
		   View listItem = listAdapter.getView(i, null, listView);
		   listItem.measure(0, 0);
		   totalHeight += listItem.getMeasuredHeight();
		  }
		 
		  ViewGroup.LayoutParams params = listView.getLayoutParams();
		  params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)) +10;
		  listView.setLayoutParams(params);
		 }

}

<span style="font-family:SimSun;"></span>

2、对于ListView或是ScrollView嵌套GridView,一般是:


<pre name="code" class="java">public class NoScrollGridView extends GridView {

	public NoScrollGridView(Context context) {
		super(context);
	}

	public NoScrollGridView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public NoScrollGridView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
		super.onMeasure(widthMeasureSpec, expandSpec);
	}

}


3、对于嵌套的ListView内容如果是TextView内容大于一行显示不全的,则ListView的高度就会计算错误,它只计算了一行的高度,对于TextView可重写它的onMeasure方法,计算高度后,再去重新set

public class ShareAppendixTextView extends TextView {
    private Context context;

    public ShareAppendixTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
    }



    public ShareAppendixTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    public ShareAppendixTextView(Context context) {
        super(context);
        this.context = context;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Layout layout = getLayout();
        if (layout != null) {
            int height = (int)Math.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嵌套ListView,显示多行的问题就能得到解决,上一张解决的图片:


版权声明:本文为博主原创文章,未经博主允许不得转载。

解决ScrollView下嵌套GridView显示不全的问题

此问题主要是由于GridView都是可滑动的控件,嵌套在ScrollView下时需要重写onMeasure方法。public class MyGridView extends GridView{ ...
  • CSDN_LQR
  • CSDN_LQR
  • 2016年08月30日 15:52
  • 696

ScrollView嵌套GridView,GridView显示不全

在ScrollView里布局GridView时,GridView显示往往是以单行显示出来。这是由于GridView和ScrollView里都有滑动属性。ScrollView无法判断GridView里的...
  • loongago
  • loongago
  • 2016年04月06日 20:10
  • 6795

ListView嵌套GridView显示不全解决方法

其实这个ListView上一共需要显示的是6张图片,也就是说还有3张图片需要在下一行显示的,结果GridView没有显示完全,这个问题很奇怪,但是已经找到解决的方案,就是重写一个GridView,做一...
  • lee_tianya
  • lee_tianya
  • 2014年10月16日 19:14
  • 6519

ListView中嵌套GridView关于GridView的高度显示问题

转载于: http://gundumw100.iteye.com/blog/1732987 经常要在ScrollView中嵌入ListView,网上方法一大堆,但都比较繁琐。  本人...
  • nnmmbb
  • nnmmbb
  • 2015年11月20日 18:02
  • 1403

ListView显示最后一条Item不完整问题分析

比如,有这么一个需求:实现一个IM类型的app聊天界面 要如何做呢? 很简单,一个title在顶部,一个输入框+按钮在底部 ,中间是一个ListView,搞定!!! 然后,ListView需要动态添加...
  • javine
  • javine
  • 2016年02月24日 21:51
  • 7171

ScrollView嵌套GridView显示不全解决方法

由于ScrollView和GridView这两款控件都自带滚动条,一起使用GridView会显示不全 解决方法:自定义gridview...
  • chenhq305
  • chenhq305
  • 2015年07月13日 15:34
  • 423

Android的ScrollView下嵌套GridView显示不完全问题处理

在Android中,ScrollView和GridView一起使用的话,会出现GridView显示不完全的问题。针对这一个问题,我们对GridView进行处理。 首先先写一个MyGridView类:...
  • qq_21139343
  • qq_21139343
  • 2016年08月13日 19:10
  • 314

解决:ScrollView嵌套ListView导致无法正确计算ListView的高度之动态加载图片高度常规方法失效。

上述问题很多人都遇到过。相信很多人都用过网络常见的解决方法 ,即重写ListVIew的onMeasure方法。这种方式可以禁止ListView响应滑动事件   并且还能让ListView正确计算高度。...
  • w1383202
  • w1383202
  • 2016年05月11日 13:12
  • 1356

ListView item错位 由于Item复用时高度不一致导致ListView 显示错误

不复用 Item 就可以解决了 !!!求大神其他解决方法 // // if(convertView == null){ holder = new ViewH...
  • QP1203300848
  • QP1203300848
  • 2016年06月30日 16:51
  • 489

ScrollView 中嵌套 GridView 导致 ScrollView 默认不停留在顶部的解决方案和分析

发生情况大概是我在ScrollView顶部放了一个ViewPager用来做广告Banner,底部放了个GridVie, 来实现一个类似9宫格效果的展示. 然后出现的状况是,当我获取完数据并调用n...
  • richie0006
  • richie0006
  • 2016年03月04日 10:30
  • 609
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ListView(ScrollView)嵌套ListView、GridView显示不全,内容大于一行计算的高度不正确的解决办法
举报原因:
原因补充:

(最多只允许输入30个字)