RecyclerView Item中用ViewPager的一點小坑
阿新 • • 發佈:2019-01-04
使用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(); } }