Android ViewPager实现无限循环效果
作者:lijiao 时间:2022-03-14 00:15:42
最近项目里有用到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);
}
}
}
标签:Android,ViewPager,无限循环
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
面试初级Java开发问到Arrays
2023-11-27 05:40:04
mybatis mybatis-plus-generator+clickhouse自动生成代码案例详解
2021-06-06 10:12:55
SpringMVC之@requestBody的作用及说明
2022-06-08 12:35:04
Spring Boot环境属性占位符解析及类型转换详解
2023-10-21 20:37:35
![](https://img.aspxhome.com/file/2023/4/66524_0s.png)
jvm虚拟机类加载机制详解
2021-10-21 08:33:28
![](https://img.aspxhome.com/file/2023/7/76497_0s.jpg)
Android实现志愿者系统详细步骤与代码
2022-01-08 22:41:42
![](https://img.aspxhome.com/file/2023/0/89550_0s.png)
详解JAVA中的for-each循环与迭代
2022-05-11 12:29:14
TextBox获取输入焦点时自动全选的实现方法
2022-01-01 02:22:49
ReentrantLock获取锁释放锁的流程示例分析
2021-08-05 20:51:10
![](https://img.aspxhome.com/file/2023/4/72914_0s.png)
C#与js实现去除textbox文本框里面重复记录的方法
2022-08-02 03:14:06
C# CSV文件读写的实现
2023-05-24 10:39:07
关于重写equals()方法和hashCode()方法及其简单的应用
2023-08-01 06:48:13
![](https://img.aspxhome.com/file/2023/5/57805_0s.jpg)
关于Android 6.0权限的动态适配详解
2021-09-16 07:56:34
![](https://img.aspxhome.com/file/2023/8/108258_0s.jpg)
Java毕业设计实战之生活旅行分享平台的实现
2022-02-01 02:42:18
![](https://img.aspxhome.com/file/2023/9/72519_0s.jpg)
Spring Feign超时设置深入了解
2022-01-17 10:39:06
![](https://img.aspxhome.com/file/2023/7/86727_0s.png)
详解Java的Spring框架下bean的自动装载方式
2022-10-23 08:13:59
![](https://img.aspxhome.com/file/2023/2/64432_0s.png)
C#面向对象设计原则之里氏替换原则
2022-08-27 23:59:22
C#简单读取、改变文件的创建、修改及访问时间的方法
2022-11-12 03:56:50
Java字符串编码解码性能提升的技巧分享
2022-01-30 08:45:13
![](https://img.aspxhome.com/file/2023/3/113423_0s.png)
Java数组越界问题实例解析
2023-10-25 18:16:23