Android,控件与NestedScrollView和ScrollView发生冲突的最强解决办法

Android,控件与NestedScrollView和ScrollView发生冲突的最强解决办法


前言

文章如有错误请留言告知


提示:以下是本篇文章正文内容,下面案例可供参考

一、NestedScrollView嵌套GridView不能一起滑动的问题

解决办法 就是使用自定义的GridView就可以了

操作方法

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

/**
 * 自定义 GridView
 */
public class MyGridView extends GridView {

    public MyGridView(Context context) {
        super(context);
    }

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

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

    /**
     *size  测量规格大小
     *mode  测量规范模式
     *return 根据大小和模式测量规格
     * 重写该方法,达到使 GridView 适应 ExpandableListView 的效果
     *
     *这个方法的主要作用就是根据你提供的大小和模式,返回你想要的大小值,这个里面根据传入模式的同来做相应的处理。
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

二.解决ScrollView嵌套ListView和GridView冲突的方法

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 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);  
        }  
}  
public class MyGridView extends GridView {     
    private boolean haveScrollbar = true;     
    public MyGridView(Context context) {     
        super(context);     
    }     
    public MyGridView(Context context, AttributeSet attrs) {     
        super(context, attrs);     
    }     
    public MyGridView(Context context, AttributeSet attrs, int defStyle) {     
        super(context, attrs, defStyle);     
    }     
    /**    
     * 设置是否有ScrollBar,当要在ScollView中显示时,应当设置为false。 默认为 true    
     *     
     * @param haveScrollbars    
     */     
    public void setHaveScrollbar(boolean haveScrollbar) {     
        this.haveScrollbar = haveScrollbar;     
    }     
    @Override     
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {     
        if (haveScrollbars == false) {     
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);    
            super.onMeasure(widthMeasureSpec, expandSpec);     
        } else {     
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);     
        }     
    }     
}  

MeasureSpec方法通常在ViewGroup中用到,它可以根据模式(MeasureSpec里面的三个)调节子元素的大小
MeasureSpec的几种模式

模式解析
精确模式(MeasureSpec.EXACTLY)在这种模式下,尺寸的值是多少,那么这个组件的长或宽就是多少。
最大模式(MeasureSpec.AT_MOST)这个也就是父组件,能够给出的最大的空间,当前组件的长或宽最大只能为这么大,当然也可以比这个小。
.未指定模式(MeasureSpec.UNSPECIFIED)这个就是说,当前组件,可以随便用空间,不受限制。

MeasureSpec工具类。

方法解析
public static int makeMeasureSpec(int size, int mode)这个是由我们给出的尺寸大小和模式生成一个包含这两个信息的int变量,这里这个模式这个参数,传三个常量中的一个。
public static int getMode(int measureSpec)这个是得到这个变量中表示的模式信息,将得到的值与三个常量进行比较
public static int getSize(int measureSpec)这个是得到这个变量中表示的尺寸大小的值。
public static String toString(int measureSpec)把这个变量里面的模式和大小组成字符串返回来,方便打日志

总结

好好学习,天天向上

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值