详解嵌套ListView、ScrollView布局显示不全的问题

在项目开发中,可能经常遇到嵌套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种模式

  1. UNSPECIFIED模式,官方意思是:父布局没有给子布局强加任何约束,子布局想要多大就要多大,说白了就是不确定大小
  2. EXACTLY模式,官方意思是:父布局给子布局限定了准确的大小,子布局的大小就是精确的,父亲给多大就是多大
  3. 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

详解嵌套ListView、ScrollView布局显示不全的问题的相关文章

解决ScrollView下嵌套ListView、GridView显示不全的问题(冲突)

原文地址:http://blog.csdn.net/cs_li1126/article/details/12906203 一.使用网上用的动态改变listview高度的方法,该方法只适用于item布局是LinearLayout布局的情况,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常.所以使用限制较大. [java] view plaincopy public class Utility { publ

android _scrollview嵌套listview出现高度显示不全解决方案

只要在工具类里写上这一段代码:/** * scrollview嵌套listview显示不全解决 * @param listView */ public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int t

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

/** * 自定义gridview,解决ListView中嵌套gridview显示不正常的问题(1行半) * @author wangyx * @version 1.0.0 2012-9-14 */ public class MyGridView extends GridView{ public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context

Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

[Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.Android 布局学习之——LinearLayout的layout_weight属性   4.Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline    Layout Parameters(布局参数): 在XML文件中,我们经常看到类似与lay

Android开发详解之ListView详解一

列表ListView介绍和实例 1.ListView  -- ListActivity -- ListAdapter 2.ArrayAdapter结合ListView进行显示 3.SimpleAdapter结合ListView进行显示 4.处理单击ListView事件,处理选择ListView的事件 5.使用SimpleCursorAdapter与ListView进行关联 ListView : 要让一个ListView显示出来需要的3个条件: 1.ListView  --- 需要被显示的列表 2

详解CSS的Flex布局

本文由云+社区发表 Flex是Flexible Box 的缩写,意为"弹性布局",是CSS3的一种布局模式.通过Flex布局,可以很优雅地解决很多CSS布局的问题.下面会分别介绍容器的6个属性和项目的6个属性.每个属性会附上效果图,具体实现代码会以github路径形式更新于此. 1.浏览器支持情况 可以点击查看各浏览器的兼容情况 2.容器的属性 注意,设为 Flex 布局以后,子元素的float.clear和vertical-align属性将失效. 容器的属性有6个,分别是: flex

android中ScrollView嵌套ListView或GridView显示位置问题

Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即可. 1 android:focusableInTouchMode="true" 2 android:focusable="true" 还有一个问题:在ScrollView嵌套ListView或GridView时仅仅显示一行或两行,ListView或GridView无法

ScrollView内嵌套ListView时的显示与滑动问题

最近的项目中遇到了SrcollView内嵌ListView的需求,要求ListView内容全部展示,但是实际效果ListView却只显示了一行,一开始以为是代码异常了,只生成了一行视图,实际上就是SrcollView和ListView的冲突问题.解决办法就是禁止ListView的滑动. 一.自定ListView,其实就是包了一层处理而已,很简单. package com.hundsun.bridge.view; import android.content.Context; import and

C++多态篇2——虚函数表详解之从内存布局看函数重载,函数覆盖,函数隐藏

上一篇C++多态篇1一静态联编,动态联编.虚函数与虚函数表vtable中,我在最后分析了虚函数与虚函数表的内存布局,在下一篇详细剖析虚函数及虚函数表的过程中,我发现有关函数重载,函数覆盖,函数重写和函数协变的知识也要理解清楚才能对虚函数表在内存中的布局,对派生类的对象模型以及对多态的实现有更深的理解. 所以这一篇我作为一篇过渡篇,也同时对我以前写过的一篇博文进行一个收尾.在C++继承详解之二--派生类成员函数详解(函数隐藏.构造函数与兼容覆盖规则)文章中,我对函数覆盖,重载,重写提了一下,但是没