ScrollView嵌套ListView或GridView等,使得其高度自适应解决方案
来源:互联网 发布:大作家软件好用吗 编辑:程序博客网 时间:2024/06/03 17:27
这类的文章有很多,写此文的目的是为了备忘吧。ScrollView里面嵌套ListView或GridView等,两个View都有滚动的效果,在嵌套使用时起了冲突,一般不建议两者套用。解决的方案有很多但是最优的解决方案如下:
package com.base.frame.view;import android.content.Context;import android.util.AttributeSet;import android.widget.ListView;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);} /** * 重写该方法,达到使ListView适应ScrollView的效果(因为listview的高度是不确定的,所以每次要重新测量) */@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }}
原理解析:
了解自定义view 的肯定知道 onMeasure()是什么意思,makeMeasureSpec()方法中 Integer.MAX_VALUE >> 2
在Android中,一个控件所占的模式和大小是通过一个整数int来表示的,这里很多同学就疑惑了,一个int值是怎么来表示模式的大小的,这里来看一张图片:
在Android中,一个控件所占的模式和大小是通过一个整数int来表示的,这里很多同学就疑惑了,一个int值是怎么来表示模式的大小的,这里来看一张图片:
原来,Android里面把int的最高2两位来表示模式,最低30位来表示大小。
测量View大小使用的是onMeasure函数,我们可以从onMeasure的两个参数中取出宽高的相关数据:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthsize = MeasureSpec.getSize(widthMeasureSpec); //取出宽度的确切数值 int widthmode = MeasureSpec.getMode(widthMeasureSpec); //取出宽度的测量模式 int heightsize = MeasureSpec.getSize(heightMeasureSpec); //取出高度的确切数值 int heightmode = MeasureSpec.getMode(heightMeasureSpec); //取出高度的测量模式 }
从上面可以看出 onMeasure 函数中有 widthMeasureSpec 和 heightMeasureSpec 这两个 int 类型的参数, 毫无疑问他们是和宽高相关的, 但它们其实不是宽和高, 而是由宽、高和各自方向上对应的测量模式来合成的一个值:
测量模式一共有三种, 被定义在 Android 中的 View 类的一个内部类View.MeasureSpec中:
测量模式一共有三种, 被定义在 Android 中的 View 类的一个内部类View.MeasureSpec中:
3种模式
1):UNSPECIFIED模式,官方意思是:父布局没有给子布局强加任何约束,子布局想要多大就要多大,说白了就是不确定大小
2)EXACTLY模式,官方意思是:父布局给子布局限定了准确的大小,子布局的大小就是精确的,父亲给多大就是多大
3)AT_MOST模式,官方意思是:父布局给定了一个最大的值,子布局的大小不能超过这个值,当然可以比这个值小
1):UNSPECIFIED模式,官方意思是:父布局没有给子布局强加任何约束,子布局想要多大就要多大,说白了就是不确定大小
2)EXACTLY模式,官方意思是:父布局给子布局限定了准确的大小,子布局的大小就是精确的,父亲给多大就是多大
3)AT_MOST模式,官方意思是:父布局给定了一个最大的值,子布局的大小不能超过这个值,当然可以比这个值小
private static final int MODE_SHIFT = 30;publicstatic final int UNSPECIFIED = 0 << MODE_SHIFT;publicstatic final int EXACTLY = 1 << MODE_SHIFT;publicstatic final int AT_MOST = 2 << MODE_SHIFT;
不确定模式是0左移30位,也就是int类型的最高两位是00
精确模式是1左移30位,也就是int类型的最高两位是01
最大模式是是2左移30位,也就是int类型的最高两位是10
所以调用了makeMeasureSpec方法,这个方法是用来生成一个带有模式和大小信息的int值的,第一个参数Integer.MAX_VALUE >> 2,这个参数是传的一个大小值,为什么是这个值呢,我们现在已经知道了,我们要生成的控件,它的大小最大值是int的最低30位的最大值,我们先取Integer.MAX_VALUE来获取int值的最大值,然后左移2位就得到这个临界值最大值了
当然,我们在手机上的控件的大小不可能那么大,极限值就那么大,实际肯定比那个小,所以这个模式就得选择MeasureSpec.AT_MOST了,最后将生成的这个大小传递给父控件就可以了,super.onMeasure(widthMeasureSpec, expandSpec),这个函数只改变的是控件的高度,宽度没有改变,实际开发当中不管listview有多少条数据,都能一次性展现出来。最后选用第三种方式完美实现。
阅读全文
0 0
- ScrollView嵌套ListView或GridView等,使得其高度自适应解决方案
- ScrollView嵌套下ListView或ExpandableListView的高度自适应
- ScrollView嵌套下ListView或ExpandableListView的高度自适应
- ScrollView嵌套ListView或gridview
- ScrollView嵌套Listview或GridView
- GridView ListView 嵌套 ScrollView 解决方案
- android ListView 嵌套scrollView 自适应高度
- Scrollview 嵌套 listview 或 gridview 导致 ScrollView默认不停留在顶部的解决方案和分析
- ScrollView 嵌套 listView、gridView 冲突的解决方案
- scrollview嵌套viewpager嵌套listview或gridview 框架的完美解决方案
- ScrollView嵌套ListView,gridView只显示一行解决方案 (以及计算显示高度错误问题)
- 关于scrollview--listview(内部嵌套gridview等)的高度测量异常
- ScrollView 嵌套ListView嵌套GridView或ListView卡顿
- scrollview嵌套listview,gridview时使用自定义listview或gridview
- ScrollView嵌套GridView、ListView
- ScrollView嵌套ListView、GridView
- ScrollView 嵌套 ListView GridView
- ListView 与 GridView 在ScrollView中自适应高度
- 编程之美读书笔记之CPU、内存管理
- java基础总结2
- 如何自学机器学习
- Kotlin 是什么?
- List
- ScrollView嵌套ListView或GridView等,使得其高度自适应解决方案
- 【转】BGP 学习笔记 (一)
- [展览人周刊]华展云20170717期
- 219. Contains Duplicate II
- Unity3d 资源管理
- java mongodb 操作
- 184. Department Highest Salary
- 算法题目---第一个只出现一次的字符
- 02:不吉利日期