RecyclerView Item中用ViewPager的一点小坑

    使用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();
        }
    }

你可能感兴趣的:(RecyclerView Item中用ViewPager的一点小坑)