使用ViewPager作为RecyclerView的head来当广告是经常使用的了,这么频繁的设计我以为应该坑都被踩遍了,那天自测发现居然还有坑。
需求是在列表的第一项需要有一个轮询的广告,每隔多久就自动切换一下。 我第一反应当然是添加OnPageChangeListener来监听滑动状态,重写onPageScrollStateChanged方法在滑动停下来的时候,把最后一张和第一张给替换掉,这个过程反正网上有很多素材,不多讲。
下面来说坑吧,就是在RecyclerView上下滑动的时候,原先的View会处于不可见状态,再滑出来是属于一个重新添加到列表这个容器里的过程。也就是对于ViewPager来说,调用了onAttachedToWindow()这个方法
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mFirstLayout = true;
}
来看一下这个方法,他把这个mFirstLayout 设置成了false。
这就导致了,先滑下来,在轮询到切换广告时,再滑上去,切换的动画不执行的现象。
这次滚动没动画会导致onPageScrollStateChanged不调用,那么之前为了做重复切换广告的首位View的设置就不起作用了。
但这个mFirstLayout 是私有的,所以只能通过反射来修改属性值
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mHasDetach = false;
try {
Field mFirstLayout = ViewPager.class.getDeclaredField("mFirstLayout");
mFirstLayout.setAccessible(true);
mFirstLayout.set(this, false);
} catch (Exception e) {
e.printStackTrace();
}
}