android viewpager實現輪播

2021-10-24 22:42:28 字數 3062 閱讀 2241

分為四步去實現:

第一步是有限手動輪播;

第二步是無限輪播;

第三步是自動輪播;

第四步是指示器適配

布局:

adapter實現:

public class banneradapter extends pageradapter 

@override

public int getcount()

@override

public boolean isviewfromobject(@nonnull view view, @nonnull object object)

@nonnull

@override

public object instantiateitem(@nonnull viewgroup container, int position)

@override

public void destroyitem(@nonnull viewgroup container, int position, @nonnull object object)

}

activity中:

// scrollview中viewpager一定要設定高度,此處根據的寬高比來設定高度

int bannerwidth = (utils.getscreenwidth(getcontext()) - utils.dip2pixel(getcontext(), 24));

linearlayout.layoutparams lp = (linearlayout.layoutparams) bannerview.getlayoutparams();

lp.width = linearlayout.layoutparams.match_parent;

lp.height = (int) (bannerwidth * 90f / 345);

bannerview.setlayoutparams(lp);

bannerview.setadapter(new banneradapter(geturllist()));

注意:scrollview包裹viewpager時,viewpager的高度一定要有確定值,否則內容無法載入出來,可以在xml中指定,也可以**設定,但一定要有確定值。

無限輪播只需要在有限輪播的基礎上,做以下兩個改動點,修改getcount返回值且在載入資料時獲取正確的資料來源即可

public class banneradapter extends pageradapter 

@override

public int getcount()

@override

public boolean isviewfromobject(@nonnull view view, @nonnull object object)

@nonnull

@override

public object instantiateitem(@nonnull viewgroup container, int position)

@override

public void destroyitem(@nonnull viewgroup container, int position, @nonnull object object)

}

修改完發現banner只能向右無限輪播,第一次左滑滑不動,這個時候我們強制設定viewpager位置在中間就可以解決這個問題了

bannerview.setadapter(new banneradapter(geturllist()));

bannerview.setcurrentitem(geturllist().size() * 5);

handler每隔輪播間隔傳送訊息,設定viewpager為下乙個位置

private runnable bannerrunnable = new runnable() 

};bannerview.addonpagechangelistener(new viewpager.onpagechangelistener()

@override

public void onpageselected(int position)

@override

public void onpagescrollstatechanged(int state)

});private void start()

指示器樣式及表現可以自己去根據需求實現,以相對簡單和常見的小圓圈指示器為例,新增和banner數量相同的小圓圈,小圓圈設定selector,在選中時為黑色選中樣式,在非選中時為灰色預設樣式,根據當前選中的banner的實際position,設定指示器的selected屬性,從而展示不同的樣式

private void initindicator() 

}private void initbannerview()

@override

public void onpageselected(int position)

start();

}@override

public void onpagescrollstatechanged(int state)

});}

附:utils檔案

public class utils 

}public static int dip2pixel(context context, float n)

/*** 獲取螢幕寬度

* @param context

* @return 螢幕寬度

*/public static int getscreenwidth(context context)

}

Android ViewPager控制項

viewpager可以實現多個介面的左右滑動。布局檔案 android id id view pager android layout width match parent android layout height match parent 介面卡,需要繼承pageradapter類 public...

android viewpager禁止左右滑動

看到禁止滑動的需求 立馬想到的就是攔截事件 其次重寫viewpager 攔截事件 一是事件ontouchevent 二是 onintercepttouchevent 使兩者都返回false 達到攔截不響應滑動操作的目的 簡潔 主要傳遞的是一種程式設計思想 public class noscrollv...

Android ViewPager動態載入資料

這個近兩年前寫的部落格,邏輯混亂,沒有完整介紹,我現在自己都不忍直視,建議去這個部落格看 這裡介紹比清晰。當對viewpager有個大致了解過後看下面 就能看懂些了,當然下面的 可以完全不看,建議直接看 訪問密碼 93f7 只有看原始碼才最有效果。其實可以把viewpager當做乙個listview...