在项目开发中,可能经常遇到嵌套ListView、ScrollView的问题,就是重写onMeasure方法.解决如下
public class ExpandListView extends ListView { public ExpandListView(Context context) { super(context); } public ExpandListView(Context context, AttributeSet attrs) { super(context, attrs); } public ExpandListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ExpandListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2 , MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
MeasureSpec这个类,如下
3种模式
- UNSPECIFIED模式,官方意思是:父布局没有给子布局强加任何约束,子布局想要多大就要多大,说白了就是不确定大小
- EXACTLY模式,官方意思是:父布局给子布局限定了准确的大小,子布局的大小就是精确的,父亲给多大就是多大
- AT_MOST模式,官方意思是:父布局给定了一个最大的值,子布局的大小不能超过这个值,当然可以比这个值小
3个方法
public static int makeMeasureSpec(int size, int mode) ,这个方法的作用是根据大小和模式来生成一个int值,这个int值封装了模式和大小信息 public static int getMode(int measureSpec),这个方法的作用是通过一个int值来获取里面的模式信息 public static int getSize(int measureSpec),这个方法的作用是通过一个int值来获取里面的大小信息
调用了makeMeasureSpec方法,这个方法是用来生成一个带有模式和大小信息的int值的,
第一个参数Integer.MAX_VALUE >> 2,这个参数是传的一个大小值要生成的控件,它的大小最大值是int的最低30位的最大值,先取Integer.MAX_VALUE来获取int值的最大值,然后左移2位就得到这个临界值最大值
当然,我们在手机上的控件的大小不可能那么大,极限值就那么大,实际肯定比那个小,所以这个模式就得选择MeasureSpec.AT_MOST,最后将生成的这个大小传递给父控件就可以了,super.onMeasure(widthMeasureSpec,
expandSpec),这个函数只改变的是控件的高度,宽度没有改变,实际开发当中不管listview有多少条数据,都能一次性展现出来
时间: 2024-12-06 12:54:45