生活随笔
收集整理的這篇文章主要介紹了
无限循环的ViewPager
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目前情況
在不修改源碼的情況下,當ViewPager滑動到最后一個item的時候,他就無法再往右滑動;當ViewPager滑動到第一個item的時候,他也無法再往前滑動。(以上全是廢話)
設想
我們可以這樣想,當滑動最后一個的時候,我們讓他跳轉到第一個,這樣他就可以繼續往后滑動了,這樣做行程了我們想要的循環滑動。
如果這樣作,雖然功能上是循環了,但是實際顯示的時候會在最后一個和第一個之間自動跳轉。
優化
我們可以在原來的鏈表中首尾各增加一個假的item,用多余的兩個item來作跳轉的動作,這樣就可以避免出現自動跳轉的錯誤畫面了。請看下面演示。
我們要顯示的是下面A、B、C畫面,位置分別是0、1、2.
?
?
?
?
實際上,我們添加數據的時候,多添加了2個。在位置0添加了最后一個界面C,在位置4添加了第一個界面A。
?
當界面滑動到位置3的時候,他還可以往右滑動,這樣給人的感覺就是循環的。但,當滑動到位置4的時候,他右邊沒有了,這樣豈不是露餡了?所以,當滑動到位置4的時候,立刻跳轉到位置1。因為他們是同樣的數據,所以從顯示效果是看不出跳轉了的,這樣實際上我們就變成了位置1,這樣就又可以繼續往右滑動了。
重復上面條件的判斷,這樣就實現了往右的循環,往左也是同樣的道理。
代碼分析
在onPageSelected里面做條件判斷,在onPageScrollStateChanged里面做跳轉。關鍵代碼如下:
初始化,首尾各增加一個item。
?
[java]?view plaincopyprint?
addTextView(POINT_LENGTH?-?1);??for?(int?i?=?0;?i?<?3;?i++)?{??addTextView(i);??addPoint(i);??}??addTextView(0);?? ?
條件判斷:
?
[java]?view plaincopyprint?
@Override??public?void?onPageSelected(int?pPosition)?{??????mIsChanged?=?true;??????if?(pPosition?>?POINT_LENGTH)?{??????????mCurrentPagePosition?=?FIRST_ITEM_INDEX;??????}?else?if?(pPosition?<?FIRST_ITEM_INDEX)?{??????????mCurrentPagePosition?=?POINT_LENGTH;??????}?else?{??????????mCurrentPagePosition?=?pPosition;??????}??????Log.i(TAG,"當前的位置是"+mCurrentPagePosition);??????setCurrentDot(mCurrentPagePosition);??}?? ?
跳轉:
?
[java]?view plaincopyprint?
@Override??public?void?onPageScrollStateChanged(int?pState)?{??????if?(ViewPager.SCROLL_STATE_IDLE?==?pState)?{??????????if?(mIsChanged)?{??????????????mIsChanged?=?false;??????????????mViewPager.setCurrentItem(mCurrentPagePosition,?false);??????????}??????}??}?? ?
完整的邏輯如下:
?
[java]?view plaincopyprint?
package?com.ahacool.circleviewpager;????import?java.util.ArrayList;????import?android.app.Activity;??import?android.os.Bundle;??import?android.support.v4.view.PagerAdapter;??import?android.support.v4.view.ViewPager;??import?android.support.v4.view.ViewPager.OnPageChangeListener;??import?android.util.Log;??import?android.view.Gravity;??import?android.view.View;??import?android.view.ViewGroup;??import?android.widget.ImageView;??import?android.widget.LinearLayout.LayoutParams;??import?android.widget.TextView;????public?class?MainActivity?extends?Activity?implements?OnPageChangeListener?{????????private?ViewPager?mViewPager;??????private?ViewGroup?mPointViewGroup;??????private?ArrayList<View>?mViewPagerList;??????private?boolean?mIsChanged?=?false;??????private?int?mCurrentPagePosition?=?FIRST_ITEM_INDEX;??????private?int?mCurrentIndex;??????private?static?final?int?POINT_LENGTH?=?3;??????private?static?final?int?FIRST_ITEM_INDEX?=?1;??????private?static?final?String?TAG?=?"MOTO";????????@Override??????protected?void?onCreate(Bundle?savedInstanceState)?{??????????super.onCreate(savedInstanceState);??????????setContentView(R.layout.activity_main);??????????initUI();??????}????????private?void?initUI()?{??????????mViewPager?=?(ViewPager)?findViewById(R.id.viewpager);??????????mPointViewGroup?=?(ViewGroup)?findViewById(R.id.point_layout);????????????mViewPagerList?=?new?ArrayList<View>();??????????????????addTextView(POINT_LENGTH?-?1);??????????????????for?(int?i?=?0;?i?<?3;?i++)?{??????????????addTextView(i);??????????????addPoint(i);??????????}??????????????????addTextView(0);????????????PagerAdapter?pagerAdapter?=?new?CustomPagerAdapter(mViewPagerList);??????????mViewPager.setAdapter(pagerAdapter);??????????mViewPager.setOnPageChangeListener(this);??????????mViewPager.setCurrentItem(mCurrentPagePosition,?false);??????}????????private?void?addTextView(int?pIndex)?{??????????TextView?textview?=?new?TextView(this);??????????textview.setLayoutParams(new?LayoutParams(LayoutParams.MATCH_PARENT,?LayoutParams.MATCH_PARENT));??????????textview.setGravity(Gravity.CENTER);??????????textview.setText("這是第"?+?(pIndex?+?1)?+?"個頁面");??????????textview.setTextSize(50);??????????mViewPagerList.add(textview);??????}????????private?void?addPoint(int?pIndex)?{??????????ImageView?pointImageView?=?new?ImageView(this);??????????LayoutParams?layoutParams?=?new?LayoutParams(20,?20);??????????layoutParams.setMargins(10,?0,?10,?0);??????????pointImageView.setLayoutParams(layoutParams);??????????pointImageView.setBackgroundResource(R.drawable.point_style);??????????if?(0?==?pIndex)?{??????????????pointImageView.setEnabled(false);??????????}??????????mPointViewGroup.addView(pointImageView);??????}????????private?void?setCurrentDot(int?positon)?{??????????????????positon?=?positon?-?1;??????????if?(positon?<?0?||?positon?>?mViewPagerList.size()?-?1?||?mCurrentIndex?==?positon)?{??????????????return;??????????}??????????mPointViewGroup.getChildAt(positon).setEnabled(false);??????????mPointViewGroup.getChildAt(mCurrentIndex).setEnabled(true);??????????mCurrentIndex?=?positon;??????}????????@Override??????public?void?onPageScrollStateChanged(int?pState)?{??????????if?(ViewPager.SCROLL_STATE_IDLE?==?pState)?{??????????????if?(mIsChanged)?{??????????????????mIsChanged?=?false;??????????????????mViewPager.setCurrentItem(mCurrentPagePosition,?false);??????????????}??????????}??????}????????@Override??????public?void?onPageScrolled(int?arg0,?float?arg1,?int?arg2)?{????????}????????@Override??????public?void?onPageSelected(int?pPosition)?{??????????mIsChanged?=?true;??????????if?(pPosition?>?POINT_LENGTH)?{??????????????mCurrentPagePosition?=?FIRST_ITEM_INDEX;??????????}?else?if?(pPosition?<?FIRST_ITEM_INDEX)?{??????????????mCurrentPagePosition?=?POINT_LENGTH;??????????}?else?{??????????????mCurrentPagePosition?=?pPosition;??????????}??????????Log.i(TAG,"當前的位置是"+mCurrentPagePosition);??????????setCurrentDot(mCurrentPagePosition);??????}????}?? ?
源碼下在地址:https://github.com/bird7310/Demos.git
?
總結
希望對大家有幫助,多提意見。近段時間項目很趕,很長時間沒看書寫博客了。趕項目趕得都麻木了,放松放松,偷偷懶,寫寫博客吧。
轉載于:https://www.cnblogs.com/dongweiq/p/3934422.html
總結
以上是生活随笔為你收集整理的无限循环的ViewPager的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。