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下嵌套ListView、GridView显示不全的问题(冲突)

一.使用网上用的动态改变listview高度的方法,该方法只适用于item布局是LinearLayout布局的情况,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onM...

ListView或GridView与ScrollView共存,高度显示问题

自定义ListView(或GridView),重写里面的OnMeasure()方法重新计算高度 public class MyListView extends ListView { public...
  • YK_ing
  • YK_ing
  • 2013年08月29日 14:48
  • 1455

获取ListView/GridView当前滚动的距离(高度)

原本以为ListView的OnScrollListener中onScroll方法可以得出ListView的滚动高度, 1 2 public v...

ScrollView嵌套GridView,GridView显示不全

在ScrollView里布局GridView时,GridView显示往往是以单行显示出来。这是由于GridView和ScrollView里都有滑动属性。ScrollView无法判断GridView里的...

ScrollView嵌套ListView冲突高度显示不全问题

实习中遇到了ScrollView里放置一个ListView的情况,照常书写代码测试的时候出现这种情况:   就是只显示一个item的高度。上网搜索了之后才知道是ScrollView嵌套ListV...

Android 和 Html 之间的交互

Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true Android(Java)与JavaS...

ScrollView嵌套listView,嵌套Gridview显示不全的解决办法

ScrolView里面嵌套了listview或者ScrollView里面嵌套GridView显示不全,只显示一条,是不是很揪心,其实,作为程序员,遇到问题找答案才是对的,不可以揪心,大不了不嵌套嘛,怎...

解决ScrollView下嵌套ListView/GridView进页面不在顶部的问题以及数据显示不全的问题( 只显示一行)

在网上看到如下的解决方案,我现在定义了多个listview,所以出现了有时候起作用有时候不起作用,错误的解决方法如下:错误解决方案1:错误解决方案2: 正确解决方案,重写ScrollView,添加如...

ScrollView中嵌套GridView,ListView只显示一行的解决办法

关于为什么只显示一行,个人理解是:如果单独使用GridView和ListView,里面的内容是固定的,底层系统很容易计算出控件要占用的宽高,当外面嵌套一层ScrollView后,就能做上下或左右滑动,...
  • lyankj
  • lyankj
  • 2016年07月12日 17:01
  • 688

[Android] 在ScrollView 中嵌套 GridView/ListView时只显示一行的原因和解决办法

在Android中,有这样一个限制,两ScrollView型的控件不能相互嵌套。像ListView和GridView就都是ScrollView型的控件。因为嵌套后,两个ScrollView型控件的滑动...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ListView(ScrollView)嵌套ListView、GridView显示不全,内容大于一行计算的高度不正确的解决办法
举报原因:
原因补充:

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