zoukankan      html  css  js  c++  java
  • 详解嵌套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有多少条数据,都能一次性展现出来

  • 相关阅读:
    DNS 查询长度
    WebSocket
    Overview of cookie persistence
    Linux Cluster
    keepalived + nginx 主主模式
    MIME 类型
    IaaS,PaaS,SaaS 的区别
    Linux下"负载均衡+高可用"集群的考虑点 以及 高可用方案说明(Keepalive/Heartbeat)
    交换机链路聚合与Linux的bond模式对照
    DHCP 中继
  • 原文地址:https://www.cnblogs.com/loaderman/p/7512911.html
Copyright © 2011-2022 走看看