ViewPager不为人知的秘密
2015-11-24 15:53
323 查看
ViewPager翻页控制
关于控制ViewPager的翻页,在网上已经有很多解决方法了,我们一个个来看看。
setScanScroll()
我们先来看一下具体实现:
修改Touch事件
同样,我们先来看看代码:
重写ViewPager
前面两种方法固然可以在一定程度上完成我们的要求,但是显得略2.所以,我们来看这种方式。首先我们要了解下ViewPager切页的原理,经过一段时间的查找,我们找到了这个类:
这个方法会在切页的时候重定向Page,那么我们只要在这个方法内重新定向到我们想要的Page就好了。
这是ViewPager的控制切页逻辑。
下面我们继续看,其实在ViewPager中,就给我们提供了一个重写的方法——canScroll,看名字就知道了,这个方法是来控制是否能够滑动的,我们来试下,我们先extends ViewPager,然后重写这个方法:
那是不是这样就可以了呢?当然不是的,不然我怎么能继续装逼呢?
虽然在大部分时间,这个回调已经可以实现ViewPager的翻页控制了,但是,如果你翻页速度很快,你就会发现,其实这个回调方法的执行,是跟不上你的速度的。如果你翻页很快,是可以跳过去的,如果你打log,你会发现,canScroll虽然会一直回调,但是回调并不是实时的,所以会出现bug。这也是为什么我开始要解释ViewPager翻页原理的原因,真不是我要装逼,而是为你留下的伏笔。
所以,最终的解决方案就是canScroll + determineTargetPage
首先,我们要重写ViewPager,不用害怕,ViewPager没有任何依赖,你可以把整个ViewPager的源代码全部copy过来,而不需要修改一行代码,除了包名。
然后,我们找到determineTargetPage这个方法,将targetPage修改下:
所以,我们要增加一个父类方法给我们后面继承的ViewPager重写:
ViewPager强制刷新UI
ViewPager不能动态刷新UI的原因主要是因为PagerAdapter中调用notifyDataSetChanged是会失效的。
通用解决方法
当ViewPager绘制完Item之后,ViewPager会把child标记为POSITION_UNCHANGED,这样就不会在notifyDataSetChanged后更新这个View了。所以,要解决这个问题,我们只需要在:更加优化一点的代码如下:
因为重绘的时候,ViewPager会的Destory Item,增加了系统开销。
更加优化的方法
当我们只需要对ViewPager中的某些元素进行更新时,我们可以在instantiateItem方法调用时,用View.setTag方法加入标志,在需要更新View时,通过findViewWithTag的方法找到对应的View进行更新。转载请注明:Android开发中文站 » ViewPager不为人知的秘密
相关文章推荐
- 深入浅析css3 border-image边框图像详解
- 【转】后期学习规范
- 图像特征提取之--PCA方法
- racle修改字段类型时报"要更改的列必须为空"处理方法
- PHP 将Base64图片保存到 Sae storage
- c/c++ void 指针
- 分析Redis架构设计
- Dual horsetail
- 多块网卡时的Internet连接
- JFreeChart绘制柱状图
- 在WordPress中实现评论头像的自定义默认和延迟加载
- SpringMVC、SpringMVC XML配置(纯XML方式)
- 矩阵求导与实例
- 在xcode7中使用纯代码编写工程准备工作
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- 实现Windows平台的端口转发
- ubuntu 关闭qq打不开的终极方法
- popupWindow自适应大小
- Let’s Hook a Library Function
- 模型视图变换时,法线向量要乘模型视图矩阵的逆转置矩阵