日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

无限循环的ViewPager

發(fā)布時(shí)間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无限循环的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?
  • //?增加第1個(gè)界面,實(shí)際上他顯示的是最后一個(gè)界面??
  • addTextView(POINT_LENGTH?-?1);??
  • //?增加實(shí)際顯示的2、3、4界面??
  • for?(int?i?=?0;?i?<?3;?i++)?{??
  • addTextView(i);??
  • addPoint(i);??
  • }??
  • //?增加最后的第5個(gè)界面,實(shí)際上他顯示的是第一個(gè)界面??
  • 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;??
  • ??
  • /**?
  • ?*?@ClassName?MainActivity?
  • ?*?@Description?循環(huán)滑動(dòng)viewpager的一種方法,滑動(dòng)很流暢。實(shí)現(xiàn)方法:在實(shí)際顯示的界面頭和尾分別增加一個(gè)界面。?
  • ?*?@author?Moto?
  • ?*?@date?2014?2014-7-18?
  • ?*??
  • ?*/??
  • 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>();??
  • ????????//?增加第1個(gè)界面,實(shí)際上他顯示的是最后一個(gè)界面??
  • ????????addTextView(POINT_LENGTH?-?1);??
  • ????????//?增加實(shí)際顯示的2、3、4界面??
  • ????????for?(int?i?=?0;?i?<?3;?i++)?{??
  • ????????????addTextView(i);??
  • ????????????addPoint(i);??
  • ????????}??
  • ????????//?增加最后的第5個(gè)界面,實(shí)際上他顯示的是第一個(gè)界面??
  • ????????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)?{??
  • ????????//?界面實(shí)際顯示的序號是第1,?2,?3。而點(diǎn)的序號應(yīng)該是0,?1,?2.所以減1.??
  • ????????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ò),歡迎將生活随笔推薦給好友。