Android基礎ViewPager的僞循環效果

關於ViewPager的使用http://blog.csdn.net/lw_zhaoritian/article/details/52431639


下面實現ViewPager的循環效果,默認的的ViewPager是不帶循環的。所以需要自己寫。參考網上例子,實現思路如下。

  1. 首尾添加重複的Fragment
  2. 監聽pager變化事件,當變化到新加的Fragment時候進行跳轉
  3. 跳轉後正常變化,既從最後到最前或最前到最後。
    圖片來自互聯網

開始改寫上次的例子:

添加Fragment

//添加最後一個到首部
        MyFragment fg0 = new MyFragment();
        Bundle args0 = new Bundle();
        args0.putString("text", "第3個Fragment");
        fg0.setArguments(args0);
        fragments.add(fg0);

        MyFragment fg1 = new MyFragment();
        Bundle args1 = new Bundle();
        args1.putString("text", "第1個Fragment");
        fg1.setArguments(args1);
        fragments.add(fg1);

        MyFragment fg2 = new MyFragment();
        Bundle args2 = new Bundle();
        args2.putString("text", "第2個Fragment");
        fg2.setArguments(args2);
        fragments.add(fg2);

        MyFragment fg3 = new MyFragment();
        Bundle args3 = new Bundle();
        args3.putString("text", "第3個Fragment");
        fg3.setArguments(args3);
        fragments.add(fg3);

        //添加第一個到尾部
        MyFragment fg4 = new MyFragment();
        Bundle args4 = new Bundle();
        args4.putString("text", "第1個Fragment");
        fg4.setArguments(args4);
        fragments.add(fg4);

設置監聽事件

設置之前先定義幾個變量:

//是否改變
private boolean mIsChanged = false;
//設置當前pager位置變量
private int mCurrentPagePosition = FIRST_ITEM_INDEX;
private static final int POINT_LENGTH = 3;
private static final int FIRST_ITEM_INDEX = 1;

監聽事件:

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                Toast.makeText(MainActivity.this,position+"",Toast.LENGTH_SHORT).show();
                mIsChanged = true;
                if (position > POINT_LENGTH) {// 末位之後,跳轉到首位(1)
                    mCurrentPagePosition = FIRST_ITEM_INDEX;
                } else if (position < FIRST_ITEM_INDEX) {// 首位之前,跳轉到末尾(N)
                    mCurrentPagePosition = POINT_LENGTH;
                } else {
                    mCurrentPagePosition = position;
                }

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                if (ViewPager.SCROLL_STATE_IDLE == state) {
                    if (mIsChanged) {
                        mIsChanged = false;
                        viewPager.setCurrentItem(mCurrentPagePosition, false);
                    }
                }


            }
        });

全部代碼:

public class MainActivity extends AppCompatActivity {
    private List<Fragment> fragments;
    private ViewPager viewPager;
    private List<String> titleList;
    private boolean mIsChanged = false;
    private int mCurrentPagePosition = FIRST_ITEM_INDEX;
    private static final int POINT_LENGTH = 3;
    private static final int FIRST_ITEM_INDEX = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        viewPager = (ViewPager) findViewById(R.id.viewpager);

        titleList = new ArrayList<String>();
        titleList.add("影音視頻");
        titleList.add("最新推薦");
        titleList.add("遊戲娛樂");
        titleList.add("影音視頻");
        titleList.add("最新推薦");
        fragments = new ArrayList<Fragment>();
        //添加最後一個到首部
        MyFragment fg0 = new MyFragment();
        Bundle args0 = new Bundle();
        args0.putString("text", "第3個Fragment");
        fg0.setArguments(args0);
        fragments.add(fg0);

        MyFragment fg1 = new MyFragment();
        Bundle args1 = new Bundle();
        args1.putString("text", "第1個Fragment");
        fg1.setArguments(args1);
        fragments.add(fg1);

        MyFragment fg2 = new MyFragment();
        Bundle args2 = new Bundle();
        args2.putString("text", "第2個Fragment");
        fg2.setArguments(args2);
        fragments.add(fg2);

        MyFragment fg3 = new MyFragment();
        Bundle args3 = new Bundle();
        args3.putString("text", "第3個Fragment");
        fg3.setArguments(args3);
        fragments.add(fg3);

        //添加第一個到尾部
        MyFragment fg4 = new MyFragment();
        Bundle args4 = new Bundle();
        args4.putString("text", "第1個Fragment");
        fg4.setArguments(args4);
        fragments.add(fg4);


        FragmentPagerAdapter adapter = new FragmentPagerAdapter(
                getSupportFragmentManager()) {

            @Override
            public int getCount() {
                return 5;
            }

            @Override
            public Fragment getItem(int position) {
                return fragments.get(position);
            }

            @Override
            public CharSequence getPageTitle(int position) {
                return titleList.get(position);
            }

        };
        viewPager.setAdapter(adapter);
        //默認打開第幾個
        viewPager.setCurrentItem(2, false);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                Toast.makeText(MainActivity.this,position+"",Toast.LENGTH_SHORT).show();
                mIsChanged = true;
                if (position > POINT_LENGTH) {// 末位之後,跳轉到首位(1)
                    mCurrentPagePosition = FIRST_ITEM_INDEX;
                } else if (position < FIRST_ITEM_INDEX) {// 首位之前,跳轉到末尾(N)
                    mCurrentPagePosition = POINT_LENGTH;
                } else {
                    mCurrentPagePosition = position;
                }

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                if (ViewPager.SCROLL_STATE_IDLE == state) {
                    if (mIsChanged) {
                        mIsChanged = false;
                        //改變位置
                        viewPager.setCurrentItem(mCurrentPagePosition, false);
                    }
                }


            }
        });


    }
}

這裏寫圖片描述

點我下載代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章