Android ViewPager實(shí)現(xiàn)無限循環(huán)效果
最近項(xiàng)目里有用到ViewPager來做廣告運(yùn)營位展示,看到現(xiàn)在很多APP的廣告運(yùn)營位都是無限循環(huán)的,所以就研究了一下這個(gè)功能的實(shí)現(xiàn)。
先看看效果

從一個(gè)方向上一直滑動(dòng),么有滑到盡頭的感覺,具體是怎么實(shí)現(xiàn)的呢?看下面的思路。
實(shí)現(xiàn)思路

此處畫了一幅圖來表達(dá)實(shí)現(xiàn)無限循環(huán)的思路,即在數(shù)據(jù)起始位置前插入最后一項(xiàng)數(shù)據(jù),在最后一項(xiàng)數(shù)據(jù)后插入第一項(xiàng)數(shù)據(jù),當(dāng)滑動(dòng)到此處時(shí),更新頁面的索引位置就ok了 。
代碼實(shí)現(xiàn)
這個(gè)方法用于數(shù)據(jù)處理,其中mediaList是原始數(shù)據(jù),newMediaList是處理完的數(shù)據(jù),mMediaList是用于頁面顯示的數(shù)據(jù)。
public void initItemList(List<MediaIntro> mediaList){
List<MediaIntro> newMediaList = new ArrayList<MediaIntro>();
newMediaList.addAll(mediaList);
if(newMediaList.size() > 1){
//第0個(gè)位最后一個(gè),向左拉動(dòng)時(shí),可以實(shí)現(xiàn)直接滑動(dòng)到最后一個(gè),最后一個(gè)是第0個(gè),可以實(shí)現(xiàn)向右滑動(dòng)的時(shí)直接跳到第0個(gè)
newMediaList.add(0,mediaList.get(mediaList.size() -1));
newMediaList.add(mediaList.get(0));
}
mMediaList = newMediaList;
}
完整的adapter的代碼:
public class AdImagePagerAdapter extends RecyclingPagerAdapter{
private LayoutInflater mInflater;
private List<MediaIntro> mMediaList = new ArrayList<MediaIntro>();
private boolean isInfiniteLoop; //是否無限循環(huán)
int size;
public AdImagePagerAdapter (LayoutInflater inflater ,List<MediaIntro> mediaList){
mInflater = inflater;
isInfiniteLoop = false;
initItemList(mediaList);
size = mMediaList.size();
}
public void initItemList(List<MediaIntro> mediaList){
List<MediaIntro> newMediaList = new ArrayList<MediaIntro>();
newMediaList.addAll(mediaList);
if(newMediaList.size() > 1){
//第0個(gè)位最后一個(gè),向左拉動(dòng)時(shí),可以實(shí)現(xiàn)直接滑動(dòng)到最后一個(gè),最后一個(gè)是第0個(gè),可以實(shí)現(xiàn)向右滑動(dòng)的時(shí)直接跳到第0個(gè)
newMediaList.add(0,mediaList.get(mediaList.size() -1));
newMediaList.add(mediaList.get(0));
}
mMediaList = newMediaList;
}
public MediaIntro getItem(int position){
return mMediaList.get(position);
}
public int getPosition(int position){
return isInfiniteLoop? position%size:position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final ViewHolder holder;
final MediaIntro media = getItem(position);
if(convertView == null){
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.home_ad_item, parent,false);
holder.mImageView = (ImageView)convertView.findViewById(R.id.homeAdItemImg);
holder.mTextView = (TextView)convertView.findViewById(R.id.homeAdItemTxt);
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();
}
if(media.source.equals(MagicSource.SOURCE_OUT_AD)){
imageLoader.displayImage(adImageUrl,holder.mImageView,adImageOptions,null,null);
holder.mTextView.setText("");
holder.mImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//廣告點(diǎn)擊事件
}
});
}else {
imageLoader.displayImage(media.imgUrl, holder.mImageView,adImageOptions,null,null);
holder.mTextView.setText(media.desc+"");
holder.mImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startMediaDetail(media);
}
});
}
return convertView;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return isInfiniteLoop ? Integer.MAX_VALUE : mMediaList.size();
}
private class ViewHolder{
ImageView mImageView = null;
TextView mTextView = null;
}
public boolean isInfiniteLoop(){
return isInfiniteLoop;
}
public AdImagePagerAdapter setInfiniteLoop(boolean isInfiniteLoop){
this.isInfiniteLoop =isInfiniteLoop;
return this;
}
}
更新頁面索引的代碼:
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
if(adImageAdapter.getCount()>1){
if(position<1){
position=adImageAdapter.getCount()-2;
adViewPager.setCurrentItem(adImageAdapter.getCount()-2,false);
}else if(position > adImageAdapter.getCount()-2){
position = 1;
adViewPager.setCurrentItem(1, false);
}
setAdPagePointSelected(position-1);
}
}
完整的滑動(dòng)監(jiān)聽器代碼
public class OnAdPageChangeListener implements OnPageChangeListener{
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
if(adImageAdapter.getCount()>1){
if(position<1){
position=adImageAdapter.getCount()-2;
adViewPager.setCurrentItem(adImageAdapter.getCount()-2,false);
}else if(position > adImageAdapter.getCount()-2){
position = 1;
adViewPager.setCurrentItem(1, false);
}
setAdPagePointSelected(position-1);
}
}
}
以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)Android軟件編程有所幫助。
- Android 使用viewpager實(shí)現(xiàn)無限循環(huán)(定時(shí)+手動(dòng))
- Android viewpager中動(dòng)態(tài)添加view并實(shí)現(xiàn)偽無限循環(huán)的方法
- Android ViewPager無限循環(huán)實(shí)現(xiàn)底部小圓點(diǎn)動(dòng)態(tài)滑動(dòng)
- Android ViewPager無限循環(huán)滑動(dòng)并可自動(dòng)滾動(dòng)完整實(shí)例
- Android無限循環(huán)RecyclerView的完美實(shí)現(xiàn)方案
- Android實(shí)現(xiàn)ViewPager無限循環(huán)效果(一)
- Android實(shí)現(xiàn)帶指示點(diǎn)的自動(dòng)輪播無限循環(huán)效果
- Android實(shí)現(xiàn)基于ViewPager的無限循環(huán)自動(dòng)播放帶指示器的輪播圖CarouselFigureView控件
- Android實(shí)戰(zhàn)打飛機(jī)游戲之無限循環(huán)的背景圖(2)
- Android TV 3D卡片無限循環(huán)效果
相關(guān)文章
Android 沉浸式改變小米魅族狀態(tài)欄顏色的實(shí)例代碼
這篇文章主要介紹了Android 沉浸式改變小米魅族狀態(tài)欄顏色的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Android Studio3.6新特性之視圖綁定ViewBinding使用指南
這篇文章主要介紹了Android Studio3.6新特性之視圖綁定ViewBinding使用指南,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
RadioButton實(shí)現(xiàn)選擇后可取消選擇
這篇文章主要為大家詳細(xì)介紹了RadioButton實(shí)現(xiàn)選擇后可取消選擇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
android采用FFmpeg實(shí)現(xiàn)音視頻合成與分離
這篇文章主要為大家詳細(xì)介紹了android采用FFmpeg實(shí)現(xiàn)音視頻合成與分離,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Android實(shí)現(xiàn)從activity中停止Service的方法
這篇文章主要介紹了Android實(shí)現(xiàn)從activity中停止Service的方法,結(jié)合實(shí)例形式簡單分析了Android中Service的注冊、創(chuàng)建及使用stopService停止Service的方法,需要的朋友可以參考下2016-01-01
Android 保存Fragment 切換狀態(tài)實(shí)例代碼
本文主要介紹Android Fragment的應(yīng)用,這里給大家用實(shí)例代碼詳細(xì)介紹了Android Fragment 切換狀態(tài),有需要的小伙伴可以參考下2016-07-07
Android長按imageview把圖片保存到本地的實(shí)例代碼
本文通過代碼給大家介紹了Android長按imageview把圖片保存到本地的實(shí)現(xiàn)方法,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-12-12

