很多項目中都有無限輪播圖,猶如網易新聞頂部的輪播圖等,是一個很常見的控件。有很多人寫(詳見codeKK),這塊按照自己的思路寫一遍,三層繼承ViewPager實現之,使得代碼清晰,改動方便。
代碼在github上 LoopViewPager
現在做成了一個Library,包含無限輪播圖、小紅點Indicator和寬高比例的RationFrameLayout。很方便使用。
使用三層繼承關系,分工明確.
頂層使用LoopView,該控件繼承ViewGroup,是一個可以無限輪播的ViewPager第二層使用Trina的AutoScrollViewPager,作為啟動器.第三層AdvancedLoopViewPager,用于功能增強。可以自定義Measure或者事件分發。ViewPager的Adapter 和 ipageIndicator 都支持notifyDateSetChanged()方法. 可以通過該方法改變數據源.
支持setCurrentItem()方法. 通過viewPager.setCurrentItem(2)設置. 并且在viewPager中設置后,indicator中不用設置,直接跟著變化.
提供了IPageIndicator接口,可以實現自己的Indicator. 寫法都很固定,無論是繼承View還是ViewGroup.
注意: 在adapter中必須要復寫getItemPosition方法,使用Fragment的話必須使用FragmentStatePagerAdapter.          public int getItemPosition(Object object) {             return POSITION_NONE;         } 
實現: 在 github上查看更多。

思考步驟: 1. 實現無限輪播的ViewPager 2. 實現自動輪播 3. 實現綁定在指示器Indicator
實現步驟:
目前實現無限輪播圖的有幾種寫法:
使ViewPager的條目個數為Integer.MAX_VALUE。使用LoopingViewPager。開源項目LoopViewPagercodeKK上有使用RecyclerView實現的,值得學習。這些實現方式自己都實現過,最終采用第三種,使用LoopViewPager,該控件繼承ViewGroup,實現了一個無限循環的ViewPager。
16/6/22解決數據只有兩張時左右擺動bug,添加另外兩個相同的數據,同時同步處理indicator數據。
如果你要使用Integer.MAX_VALUE,直接將繼承關系改變,使LoopViewPager繼承MaxValueViewPager就行,不用改變其他代碼。(不過MaxValueViewPager在滑動時候的表現十分令人失望。)
LoopingViewPager的閃爍現象不能很好的解決,另外對notifyDataSetChanged會出現意想不到的bug,也不能向adapter中傳入一個固定的List作為數據源
使用Trina的AutoScrollViewPager。
使AutoScrollViewPager繼承LoopViewPager,作為啟動器。
創建AdvancedLooperViewPager,繼承AutoScrollViewPager,增強功能。 在自己創建的這個類中,可以增強功能,需要什么就實現什么。比如可以像FlycoBanner將indicator寫在這個類中。在此不這么做,將會單獨抽取,方便替換。
增強的功能:
實現對高度的wrap_content的支持。相應的添加scale屬性。方便使用者定義寬高比例。如果layout_height為確定值(比如300dp),那么以該確定值為準。更多功能 to be continued…關于指示器寫法: 1. 繼承View全部在onDraw()方法里寫 2. 繼承ViewGroup,添加ImageView等。
這塊將會拿出來單獨學習,在這里就繼承View實現了一個SimpleCircleIndicator,但同時提供了接口可以實現自己的indicator。
參考:
viewpager: LoopingViewPager Trinea的android-auto-scroll-view-pager
indicator: JakeWharton的ViewPagerIndicator. github circleIndicator github circleIndicator
已經有的無限輪播圖: FlycoBanner
新聞熱點
疑難解答