Android中在设置scrollview中的GridView、listview不可滑动

有些时候我们需要使用scrollview嵌套GridView和listview,由于他们都是可滑动的控件,所以会出现GridView和listview可滑动的问题,为此,我们把GridView和listview高度设置为所有项高度的和(GridView根据一排几个会除相应值)。方法如下:
自定义类继承与相应控件,这里拿GridView举例,listview操作一样

public class UnscrollableGridView extends GridView {

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

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

    public UnscrollableGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //返回是GridView最大高度
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
         //设置GridView的高度为最大高度
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

我们先来了解下MeasureSpec
它是int类型,是工具类,里面包括控件的显示模式和尺寸信息,一共是32位,前两位表示显示模式,后三十位表示测量数据
显示模式一共有三种:

  • 最高两位是00的时候表示"未指定模式"。MeasureSpec.UNSPECIFIED
    当前组件,可以随便用空间,不受限制。

  • 最高两位是01的时候表示"'精确模式"。MeasureSpec.EXACTLY
    尺寸的值是多少,那么这个组件的长或宽就是多少。

  • 最高两位是11的时候表示"最大模式"。MeasureSpec.AT_MOST
    父组件,能够给出的最大的空间,当前组件的长或宽最大只能为这么大,当然也可以比这个小。

上面我们采用的是“最大模式”,在onMeasure()时,设置GridView的高度就是每一项高度的和(GridView根据一排几个会除相应值),这样写直接把所有的GridView的每一项都绘制出来了,所以GridView的复用就失效了,从而也不存在,在scrollview中GridView单独滑动的可能。


起床了.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容