1. 程式人生 > >RecyclerView Item中用ViewPager的一點小坑

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