ViewPager实现无限循环
引言
这两天在项目里实用到ViewPager来做广告运营位展示。看到如今非常多APP的广告运营位都是无限循环的,所以就研究了一下这个功能的实现。
先看看效果
从一个方向上一直滑动。么有滑到尽头的感觉。详细是怎么实现的呢?看以下的思路。
实现思路
此处画了一幅图来表达实现无限循环的思路,即在数据起始位置前插入最后一项数据。在最后一项数据后插入第一项数据,当滑动到此处时。更新页面的索引位置就ok了 。
代码实现
这种方法用于数据处理,当中mediaList是原始数据,newMediaList是处理完的数据,mMediaList是用于页面显示的数据。
public void initItemList(List<MediaIntro> mediaList){
List<MediaIntro> newMediaList = new ArrayList<MediaIntro>();
newMediaList.addAll(mediaList);
if(newMediaList.size() > 1){
//第0个位最后一个,向左拉动时。能够实现直接滑动到最后一个。最后一个是第0个。能够实现向右滑动的时直接跳到第0个
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; //是否无限循环
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个位最后一个,向左拉动时。能够实现直接滑动到最后一个。最后一个是第0个,能够实现向右滑动的时直接跳到第0个
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
//广告点击事件
}
});
}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);
}
}
完整的滑动监听器代码
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);
}
}
}
详细效果
哈哈,看上去效果还能够。
总结
当然肯定还有别的办法来实现,这是我近期用到的实现方式。就把它记录下来。
每天写点代码,挺快乐的,分享出来和大家一起快乐。晚安。
ViewPager实现无限循环的更多相关文章
- 自定义完美的ViewPager 真正无限循环的轮播图
网上80%的思路关于Android轮播图无限循环都是不正确的,不是真正意义上的无限循环, 其思路大多是将ViewPager的getCount方法返回值设置为Integer.MAX_VALUE, 然后呢 ...
- android 自定义Viewpager实现无限循环
; i < imageUrls.length; i ++){ ADInfo info = new ADInfo(); info.setUrl(imageUrls[i]); info.setCon ...
- Android使用ViewPager实现无限循环滑动及轮播(附源代码)
MainActivity例如以下: package cc.ww; import java.util.ArrayList; import android.app.Activity; import and ...
- 详细分析Android viewpager 无限循环滚动图片
由于最近在忙于项目,就没时间更新博客了,于是趁着周日在房间把最近的在项目中遇到的技术总结下.最近在项目中要做一个在viewpager无限滚动图片的需求,其实百度一下有好多的例子,但是大部分虽然实现了, ...
- 一行代码引入 ViewPager 无限循环 + 页码显示
(出处:http://www.cnblogs.com/linguanh) 前序: 网上的这类 ViewPager 很多,但是很多都不够好,体现在 bug多.对少页面不支持,例如1~2张图片.功能整合不 ...
- android 无限循环的viewpager
思路 例如存在 A -B -C 需要在viewpager滑动时无限循环 1.我们可以设计 C' A B C A' C'与C相同,A'与A相同 2.滑动到A'时,则index回到1 3.滑动到C'时, ...
- ViewPager,实现真正的无限循环(定时+手动)
利用定时器,实现循环轮播,很简单:只需在定时器的消息里加如下代码即可: int count = adapter.getCount(); if (count > 1) { // 多于1个,才循环 ...
- 扩展ViewFlow避免和ViewPager滑动冲突,同时支持无限循环,并完美和CircleFlowIndicator结合
首先,为了避免滑动冲突,我们要继承ViewFlow,重写onInterceptTouchEvent public class MyViewFlow extends ViewFlow { private ...
- android 自定义无限循环播放的viewPager。轮播ViewPager。实现循环播放 广告,主题内容,活动,新闻内容时。
前言 实际项目需要一个 播放广告的控件,可能有多个广告图片.每个一段时间更换该图片.简单来说,就是一个 “循环播放图片”的控件. 间隔时间更换图片 一般来说,图片切换时需要有动画效果 需要支持手势,用 ...
随机推荐
- android自己定义换行居中CenterTextView
在我们开发app时,TextView一定是使用最多的控件了,android自带的TextView的功能也十分强大.但还是有些小的地方不能满足我们的需求.几天要说的这个功能也是开发中非经常见的.就是,在 ...
- window.open 浏览器差异.
首先引入 w3help的,莫的测试: 原帖地址:http://www.w3help.org/zh-cn/causes/BX1053 w3help的测试,和我的测试相互补充,应该比较完整了.悲剧的是 ...
- 如何回收vRealize Automation里被分配出去了的IP地址
在vRealize里写代码部署虚机,时间长了,便出现了很多虚机在vCenter里不存在,但在vRealize里还存在的这台虚机的注册信息的现象.最直接的后果是,这些影子虚机会占着IP池里的IP地址不放 ...
- Oracle学习笔记(6)——函数
函数的作用 方便数据的统计 处理查询结果 函数的分类 Oracle内置的系统函数 数值函数 四舍五入 ROUND ...
- OJ模板库
近期刷了好几次的oj,好受伤好多都是相似的题目. 最长回文子串 string preprocess(string &str) { string afterProcessStr="#& ...
- AVR单片机命名规则
ATmega64 TQFP封装现主要有以下型号:ATmega64L-8AU.ATmega64L-8AI.ATmega64-16AU.ATmega64-16AI. 型号标识说明: (1)带"L ...
- 解决ThinkPHP的Create方法失效而没有提示错误信息的问题
ThinkPHP中的数据创建Create方法是一个非常有用的功能,它自动根据表单数据创建数据对象(在表字段很多的情况下尤其明显) 但有时候该方法可能并未按照你期望的来工作,比如方法不工作而且还没有提示 ...
- [Javascript] Check both prop exists and value is valid
Sometime you need to check one prop exists on the object and value should not be ´null´ or ´undefine ...
- [Algorithm] Circular buffer
You run an e-commerce website and want to record the last N order ids in a log. Implement a data str ...
- 关于 URL 编码及 JavaScript 编码函数【转载+整理】
原文地址:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 本文内容 引入 环境 测试 JavaScript 编码函数 引入 URL ...