Android-ViewPager-循環(huán)滑動(輪播)

一.問題

ViewPager可以左右滑動頁, 但是不能從首頁跳到最后頁,也不能從最后頁跳到首頁。
這就限制左右循環(huán)滑動的功能, 難以實(shí)現(xiàn)輪播效果!

二.解決方法

方法一

監(jiān)聽ViewPager滑動狀態(tài) OnPageChangeListener
1.當(dāng)首頁向右滑時, ViewPager.setCurrentItem 設(shè)為最后頁;
2.當(dāng)最后頁向左滑時, ViewPager.setCurrentItem 設(shè)為首頁!
缺陷:很明顯首頁和最后頁過渡效果差,動畫效果不好控制,麻煩!

方法二

1.把ViewPager總頁數(shù)設(shè)為整數(shù)最大值,欺騙ViewPager(PagerAdapter),使得用戶不可能滑到邊界;
2.把ViewPager初始位置設(shè)為整數(shù)最大值的一半附近;
3.與ViewPager有關(guān)的position都要和真實(shí)總頁數(shù)取余數(shù),轉(zhuǎn)換為真實(shí)頁數(shù)!
方法二明顯比方法一過渡效果自然, 用戶不可能滑動到整數(shù)最大值!
雖然把總頁數(shù)設(shè)為整數(shù)最大值, 但是ViewPager創(chuàng)建總對象數(shù)并沒有增多, 性能消耗不變!
此方法雖然是旁門左道,但是可行有效便捷!

public class MainActivity extends Activity {
    int mPageSize; // 真實(shí)總頁數(shù)
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);     
        viewPager.setAdapter(new MyPagerAdapter());
        
        // 把初始位置設(shè)為總頁數(shù)一半(總頁數(shù)為虛構(gòu)最大值,用于欺騙ViewPager)
        // 減去余數(shù),使初始位置為真實(shí)首頁數(shù)
        int hMax = Integer.MAX_VALUE/2;     
        viewPager.setCurrentItem(hMax - (hMax%mPageSize)) ; 
        
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {
            @Override           
            public void onPageSelected(int position) {              
                position = position%mPageSize; // 求余,恢復(fù)真實(shí)頁數(shù)
                ......          
            }
            
            @Override
            public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {
                position = position%mPageSize; // 求余,恢復(fù)真實(shí)頁數(shù)
                ......
            }
            
            @Override       
            public void onPageScrollStateChanged(int state) {               
            }
        });
    }   

    private class MyPagerAdapter extends PagerAdapter {
        @Override       
        public int getCount() {
            // 把總頁數(shù)設(shè)為int最大值,欺騙ViewPager(PagerAdapter)
            // mPageSize才是真實(shí)總頁數(shù)
            return Integer.MAX_VALUE; 
        }

        @Override   
        public Object instantiateItem(ViewGroup container, int position) {
            position = position%mPageSize; // 求余,恢復(fù)真實(shí)頁數(shù)
            ......
        }

        @Override       
        public boolean isViewFromObject(View view, Object object) {     
        }

        @Override       
        public void destroyItem(ViewGroup container, int position, Object object) {
            position = position%mPageSize; // 求余,恢復(fù)真實(shí)頁數(shù)
            ......          
        }
    }

}

簡書:
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/72633317
GitHub博客:http://lioil.win/2017/05/22/Android_ViewPager_Slide.html
Coding博客:http://c.lioil.win/2017/05/22/Android_ViewPager_Slide.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容