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) | 把这个变量里面的模式和大小组成字符串返回来,方便打日志 |
总结
好好学习,天天向上