最近做一个需求,界面上方是一个可滑动切换的viewpager列表,下方是一个用recyclerview做的菜单,recyclerview的item对应viewpager的一页,要求在滑动上面或者下面的时候另一个都要跟着滑动,就好像你执行一次滑动却产生了两个事件序列。
我的思路是分别对viewpager和recyclerview的滑动进行监听,比如viewpager滑动了就计算出他本次滑动到了哪个position,相对于这个position的offset是多少,然后把position和offset传给recyclerview使其滑动到指定的位置。在这个过程中梳理了一下相关的知识点:
1.ViewPager:
FragmentStatePagerAdapter和FragmentPagerAdapter的区别主要在于destroyItem的实现,刚开始的时候我们会给viewpager设置离屏的缓存数量,对于超出缓存范围的fragment,前者会直接从FragmentManager中remove,也就是销毁;而后者只是调用fragment的detach方法销毁视图(这时调用getView返回的是null)。对于本需求这种多页面的来说明显用FragmentPagerAdapter会占用过多内存。
滑动:滑动监听使用addOnPageChangeListener的onPageScrolled回调方法,参数包括页面position和相对这个页面的offset,很方便。如果我们想要翻过一页的话,需要滑动多少距离呢,如果调用了setPageMargin的话,那么就是一页的width+pageMargin。
页面切换效果:如果通过setPageTransformer设置了切换效果,那么在调用scrollTo手动控制viewpager滑动的时候还要处理