生活随笔
收集整理的這篇文章主要介紹了
无限循环的ViewPager
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目前情況
在不修改源碼的情況下,當(dāng)ViewPager滑動(dòng)到最后一個(gè)item的時(shí)候,他就無法再往右滑動(dòng);當(dāng)ViewPager滑動(dòng)到第一個(gè)item的時(shí)候,他也無法再往前滑動(dòng)。(以上全是廢話)
設(shè)想
我們可以這樣想,當(dāng)滑動(dòng)最后一個(gè)的時(shí)候,我們讓他跳轉(zhuǎn)到第一個(gè),這樣他就可以繼續(xù)往后滑動(dòng)了,這樣做行程了我們想要的循環(huán)滑動(dòng)。
如果這樣作,雖然功能上是循環(huán)了,但是實(shí)際顯示的時(shí)候會(huì)在最后一個(gè)和第一個(gè)之間自動(dòng)跳轉(zhuǎn)。
優(yōu)化
我們可以在原來的鏈表中首尾各增加一個(gè)假的item,用多余的兩個(gè)item來作跳轉(zhuǎn)的動(dòng)作,這樣就可以避免出現(xiàn)自動(dòng)跳轉(zhuǎn)的錯(cuò)誤畫面了。請看下面演示。
我們要顯示的是下面A、B、C畫面,位置分別是0、1、2.
?
?
?
?
實(shí)際上,我們添加數(shù)據(jù)的時(shí)候,多添加了2個(gè)。在位置0添加了最后一個(gè)界面C,在位置4添加了第一個(gè)界面A。
?
當(dāng)界面滑動(dòng)到位置3的時(shí)候,他還可以往右滑動(dòng),這樣給人的感覺就是循環(huán)的。但,當(dāng)滑動(dòng)到位置4的時(shí)候,他右邊沒有了,這樣豈不是露餡了?所以,當(dāng)滑動(dòng)到位置4的時(shí)候,立刻跳轉(zhuǎn)到位置1。因?yàn)樗麄兪峭瑯拥臄?shù)據(jù),所以從顯示效果是看不出跳轉(zhuǎn)了的,這樣實(shí)際上我們就變成了位置1,這樣就又可以繼續(xù)往右滑動(dòng)了。
重復(fù)上面條件的判斷,這樣就實(shí)現(xiàn)了往右的循環(huán),往左也是同樣的道理。
代碼分析
在onPageSelected里面做條件判斷,在onPageScrollStateChanged里面做跳轉(zhuǎn)。關(guān)鍵代碼如下:
初始化,首尾各增加一個(gè)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,"當(dāng)前的位置是"+mCurrentPagePosition);??????setCurrentDot(mCurrentPagePosition);??}?? ?
跳轉(zhuǎn):
?
[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)?+?"個(gè)頁面");??????????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,"當(dāng)前的位置是"+mCurrentPagePosition);??????????setCurrentDot(mCurrentPagePosition);??????}????}?? ?
源碼下在地址:https://github.com/bird7310/Demos.git
?
總結(jié)
希望對大家有幫助,多提意見。近段時(shí)間項(xiàng)目很趕,很長時(shí)間沒看書寫博客了。趕項(xiàng)目趕得都麻木了,放松放松,偷偷懶,寫寫博客吧。
轉(zhuǎn)載于:https://www.cnblogs.com/dongweiq/p/3934422.html
總結(jié)
以上是生活随笔為你收集整理的无限循环的ViewPager的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。