ViewPager的高度根据item的高度自适应
来源:互联网 发布:供销社大数据集团 地点 编辑:程序博客网 时间:2024/06/05 06:35
今天遇到一个坑爹的需求,需求如题,就是想实现ViewPager在切换的时候自身的高度随itemView的高度调整.
使用过ViewPager的人都知道,即使你在布局中写的高度是wrap_content,但是运行起来就会发现他其实是match_parent的效果,也就是填充整个屏幕,除非你写死一个高度.
解决这个问题,那就只能自定义一个View继承ViewPager然后重写onMeasure方法了.在onMeasure方法中获取当前正在展示的子View,然后测量其高度.然后再调用ViewPager的setMeasuredDimension方法设置高度的时候先判断当前ViewPager是否是match_parent,如果时则使用ViewPager测量的高度,否则就取子View和ViewPager各自测量高度的最小值.
那么问题来了.onMeasure方法如果才能获取到当前正在展示的子View呢?
通过getCurrentItem()可以获取当前正在展示的子View的position,然后再调用getChildAt(int position)就可以获取到该子View了.
好了,新问题来了.onMeasure方法通常只会回调2次,而且再以后的子View切换的时候并不会再回调onMeasure,该怎么解决呢?
哈,我的第一反应就是手动刷新onMeasure()方法,刚好requestLayout()方法可以帮我实现,调用这个方法,它不但可以帮我们调用onMeasure()还会调用layout()方法.那么,我只需要监听ViewPager的滑动切换就好了, 然后在
onPageSelected()方法中去调用requestLayout()方法即可,完美!
看看效果图:
展示了2张图,高度不一样,下面的红色区域代表其他布局.ViewPager会随着图片的高度自适应,下面红色区域也会随着调整.
来看看代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
测试类
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
测试类布局
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
在使用过程中发现bug,当ViewPager滑动的position大于3时,AutofitViewPager 代码的第36行获取itemView的时候返回null.
- 1
- 1
导致后面获取的测量高度永远都是0.猜测是viewpager里面最多有3个view,超过三个的时候就把旧的回收了,解决这个问题也挺巧妙的,就是在AutofitViewPager 设置adapter的时候在 instantiateItem方法中给返回的itemView设置一个id,该id就赋值为当前的position,然后再将AutofitViewPager 类的第36行代码替换为:
- 1
- 1
这样就解决了.
最后再提醒下,在显示网络图片的时候ImageView最好是在布局中实例化出来的,而不要直接在instantiateItem方法内通过new来创建,我试过用Glide库加载网络图片通过new来创建ImageView设置的LayoutParams宽高信息后,AutofitViewPager去获取ImageView的测量高度永远都是0,什么也看不到.如果是本地图片则不会有影响.
文章来自:http://blog.csdn.net/mchenys/article/details/54353136
- ViewPager的高度根据item的高度自适应
- ViewPager的高度根据item的高度自适应
- 高度自适应的ViewPager--SelfAdaptingViewPager
- viewpager动态改变每一个item的高度
- 设置viewPager的高度为自适应
- 设置viewPager的高度为自适应
- 自适应子View高度的viewPager
- 根据item的高度以及长度设置listview的高度,
- 关于ViewPager高度自适应(随着pager页的高度改变Viewpager的高度)
- 关于ViewPager高度自适应(随着pager页的高度改变Viewpager的高度)
- 关于ViewPager高度自适应(随着pager页的高度改变Viewpager的高度)
- listview 高度自适应(根据listview的条数 确定高度 )
- tableViewCell根据内容自适应高度的方法
- labe 高度根据内容的自适应
- 背景图片根据宽度自适应高度的方案
- 关于ViewPager高度自适应(随着页面高度改变Viewpager的高度)
- ListView和GridView根据item数量自适应高度的工具类封装
- 仿小红书根据图片高度自适应viewpager高度轮播图
- js e2e测试-nightwatch入门
- 设计模式六大原则
- 前端基础面试题,菜鸟必备
- EventBus3.0 使用
- Linux中epoll()函数的底层实现
- ViewPager的高度根据item的高度自适应
- Android--快速接入微信支付
- vs2015的程序在vs2013上运行出现:error MSB8020
- elasticsearch.net search使用指南
- mysql忘记root用户密码如何进行重置
- android4.4 编译SDK与使用
- iOS开发进阶
- 网络请求踩坑多
- Silver Cow Party (Dijkstra)