Android中Viewpager和Tablayout是最常用的组件。
这里我将介绍这两个组件组合无限循环的实现方式。
直接看代码的童鞋可以看看gihub。
https://github.com/cuichanghao/infivt
先看看效果图

思路:
因为是无限循环,我们要模拟无限。当然不是真正的无限循环,而是模拟下。
模拟
我在InfinitePagerAdapter定义一个循环1000遍。
如果你的tab有5个项目,我们会创建5000个tab。
对于普通用户来说这已经足够了。
起始位置设置为中间点2500左右。
边界检测
当然有可能会有变态用户,想看看有没有边界。为了防止这个情况,我们可以检测边界,如果触发检测,那我们重新设置位置为2500左右。
InfiniteViewPager - setCurrentItem()
减少内存使用
如果有5000个fragment作为viewpager或tabitem的话,那真是作死。
我们得想办法复用。
Tablayout复用
使用RecyclerTabLayout来复用同一个项目。你知道的,RecyclerView是可以复用的。这里其实是使用RecyclerView重新发明了TabLayout。
ViewPager的Item复用
通常情况下viewPager的Adapter是FragmentStatePagerAdapter/FragmentPagerAdapter。
这样的话会有一个问题就是每次会产生Fragment的add和remove的创建/销毁的情况,因为开销比较打,这样的体验就是每次都会看到重新加载一遍。
可能有人会说可以使用setOffscreenPageLimit设置为1以上来同时加载啊。问题是我们有5000个Fragment,你的app会变得很慢。
所以这里用FragmentCachePagerAdapter循环使用同一个fragment,只进行Fragment的show/hide的切换。
滚动效果
你已经看到上面的图的Tablayout的滑动效果。
这个是在RecyclerTabLayout里通过ViewPagerOnPageChangeListener监听Viewpager的滚动事件,每次很小的滚动都会触发scrollToTab -> invalidate -> onDraw的链条,在onDraw里我们就会根据滚动量,进行细微的描绘调整。
结尾
详情请看上面的github代码。
如果你只想使用这个库,那就引用下。
implementation 'com.github.cuichanghao:infivt:<最后commit的id>'
网友评论