ViewPager兩種方式實現無限輪播

2021-09-24 13:53:47 字數 4016 閱讀 6145

給自己的忠告:雖然輪子很好用,但是使用輪子的前提是:如果不去封裝一些複雜的功能,自己會用最基本的方法寫乙個,不然再好的輪子那也是別人的,當自己專案遇到和輪子不一樣的地方,那就只能束手無策或者改人家的原始碼,當然能看懂輪子的封裝思想自己學以致用並且能夠很輕鬆的更改原始碼那是最好不過的了。

兩種方案:(1)採用adapter內的getcount()方法返回integer.max_value。

(2)在列表的最前面插入最後一條資料,在列表末尾插入第乙個資料,造成迴圈的假象

在viewpager的adapter內的getcount方法中,返回乙個很大的數integer.max_value,理論上可以無限滑動。當顯示完乙個真實列表的週期後,又從真實列表的0位置顯示資料,造成無限迴圈輪播的假象。因為viewpager第一頁不能向左滑動迴圈,所以我們要通過mviewpager.setcurrentitem(integer.max_value/2)設定選中的位置,這樣最開始就可以向左滑動,但是因為要顯示第一頁所以該值%資料個數==0。因為設定為integer.max_value後會在setcurrentitem()的時候發生anr,所以這裡使用乙個自定義的較大的數比較好,這裡我是用500

//當前選中頁

private

int currentposition;

//資料項個數

private list

itemlist;

public

static

final

int mloopercount =

500;

//設定當前選中的item

currentposition =

getstartitem()

;viewpager1.

setcurrentitem

(currentposition1)

;private

intgetstartitem()

// 我們設定當前選中的位置為integer.max_value / 2,這樣開始就能往左滑動

// 但是要保證這個值與getrealposition 的 餘數為0,因為要從第一頁開始顯示

int currentitem = banneradapter.mloopercount /2;

if(currentitem %

getrealcount()

==0)// 直到找到從0開始的位置

while

(currentitem %

getrealcount()

!=0)return currentitem;

}//獲取資料項個數

private

intgetrealcount()

adapter只需將getcount()返回integer.max_value即可(這裡我們改為具體的數值),其他的操作是正常的操作。

@override

public

intgetcount()

採用handler的postdelayed方法

private handler mhandler =

newhandler()

;@override

protected

void

onresume()

@override

protected

void

onpause()

private

final runnable mlooprunnable =

newrunnable()

else

}else}}

;

有人會覺得會影響記憶體,大家可以參考這篇文章android viewpager 無限輪播integer.max_value 爭議(看原始碼)就能夠解決疑惑。

使用integer.max_value會在setcurrentitem()的時候發生anr,所以還是設定為乙個比較大的數比較好。在**中我已經更改為返回getrealcount()*500這一數值,如果文章中有返回integer.max_value的,那就是我還沒更正,大家請自行更改。

假設有三條資料,分別編號1、2、3,我們再建立乙個新的列表,長度為真實列表的長度+2,在最前面插入最後一條資料3,在最後面插入第一條資料1,新列表就變為3、1、2、3、1,當viewpager滑動到位置0時就通過setcurrentitem(int item,boolean smoothscroll)方法將頁面切換到位置3,同理當滑動到位置4時,通過該方法將頁面切換到位置1,這樣給我們的感覺就是無限迴圈。

;與方案一不同的地方就是當滑動到最後乙個時,切換到下標為1的頁面,當滑動下標為0的頁面時,切換到最後乙個

依然范特稀西 在文章中這樣說到:第二種方案在切換動畫的時候,因為當滑到位置4時,我們通過setcurrentitem(int item,boolean smoothscroll)方法,來將其切換到位置1才有了無限迴圈的效果,但為了不被發現,第二個引數smoothscroll設定為false,這樣就沒有了切換動畫,導致生硬,所以不用這個。

本來沒想實現方案二(想著會一種方法就行),但好奇心使我想看下到底有多生硬,但沒有發現生硬的效果。因為我們在onpagescrollstatechanged()方法裡監聽了動畫結束的狀態,所以當滑動到第四張,再次開啟乙個週期的時候,我們其實是滑動到了第五張,就是我們往尾部新增的那張,此時是有動畫的,並不是itemlist下標為0的位置,而且在此***中,當判斷其實最後一張的時候,我們已經通過setcurrentitem()不帶動畫效果的方式偷偷的把它切換到下標為1的位置了,所以在handler通過currentitem++方式再次滑動時,它滑動到的是下標為2的,也是帶效果的,所以不存在什麼生硬的效果。

以下我一共放了四張圖,大家可以仔細看下效果:

以上就是最基本的方法來實現viewpager的無限輪播的全部內容。具體**見github。

android viewpager 無限輪播integer.max_value 爭議(看原始碼)

viewpager系列之 仿魅族應用的廣告bannerview

android 使用viewpager實現無限輪播出現空白bug原因及解決方案(integer.max_value實現方式)

兩種方式實現checkBox readonly功能

今天在做開發的時候遇到了這樣乙個問題 有乙個checkbox選項是不能被改變的。但是checkbox又是沒有readonly屬性的,這個時候我就想到了另外乙個屬性disabled,但是disabled的物件是不能提交到後台的,所以這個又被排除掉了。想了想,只能新增事件來搞定了。於是在checkbox...

TabHost兩種實現方式

第一種 繼承tabactivity,從tabactivity中用gettabhost 方法獲取tabhost。只要定義具體tab內容布局就行了.package com.example.testtabhost import android.os.bundle import android.view.l...

兩種方式實現checkBox readonly功能

今天在做開發的時候遇到了這樣乙個問題 有乙個checkbox選項是不能被改變的。但是checkbox又是沒有readonly屬性的,這個時候我就想到了另外乙個屬性disabled,但是disabled的物件是不能提交到後台的,所以這個又被排除掉了。想了想,只能新增事件來搞定了。於是在checkbox...