解决ScrollView嵌套ListView显示不全问题

  在看本文之前请写了解一下UNSPECIFIED、EXACTLY、AT_MOST三种模式。
  在项目中经常会用到ScrollView嵌套ListView的情况。如果使用原生的ListView会出现只显示一行的情况:
解决ScrollView嵌套ListView显示不全问题_第1张图片
  出现这个的原因是在scrollView中ListView在OnMeasure阶段无法测出实际的高度,我们需要给他设置AT_MOST模式以支持很大的高度。这时候可以自定义一个MyListView 继承自Listview,然后重写onMeasure方法即可:
  

package com.chuck.contactsdemo;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

/**
 * Created by chuck on 2015/11/26.
 */
public class MyListView extends ListView{
    public MyListView(Context context) {
        super(context);
    }

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

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

  从上边我们可以看出,我们没有改变widthMeasureSpec,仅仅是调用了makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST)方法,该方法会返回一个带有模式和大小信息的int值的,第一个参数Integer.MAX_VALUE >> 2,我们知道我们的控件的大小的最大值是用30位表示的(int占32位,其中前两位用来表示文章开头所说的三种模式)。那么Integer.MAX_VALUE来获取int值的最大值,然后右移2位,就得到这个最大值了 。因为是要最大值所以只能选择AT_MOST模式。最后 super.onMeasure()方法将我们的高度值传进去就可以使ListView内容都展示出来了。
  将布局文件中的ListView改成MyListView就ok了:
  解决ScrollView嵌套ListView显示不全问题_第2张图片

你可能感兴趣的:(Android)