`

循环滚动ViewPager

阅读更多

通常我们使用的ViewPager实现的左右滑动无法循环滚动,当到达头或尾时,不能继续重头开始,上网搜集了一些资料,找到CycleViewPager可以实现左右循环滚动,实现也比较简单,直接贴代码:

主文件:

package com.vane.widget.test;

import com.example.cycleviewpager.R;
import com.vane.widget.cycleviewpager.CycleViewPager;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    private PagerAdapter adapter = new PagerAdapter() {

        private int count = 5;

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        @Override
        public int getCount() {
            return count;
        }

        public Object instantiateItem(android.view.ViewGroup container, int position) {
            TextView item = new TextView( MainActivity.this);
            item.setText( "page " + position);
            container.addView( item);
            return item;
        }

        public void destroyItem(android.view.ViewGroup container, int position, Object object) {
            container.removeView( (View)object);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState);
        setContentView( R.layout.activity_main);
        CycleViewPager pager = (CycleViewPager)findViewById( R.id.pager);
        pager.setAdapter( adapter);
    }

}

 CycleViewPager:

package com.sie.mp.widget;

import android.content.Context;
import android.database.DataSetObserver;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

public class CycleViewPager extends ViewPager {

    private InnerPagerAdapter mAdapter;

    public CycleViewPager(Context context) {
        super( context);
        setOnPageChangeListener( null);
    }

    public CycleViewPager(Context context, AttributeSet attrs) {
        super( context, attrs);
        setOnPageChangeListener( null);
    }

    @Override
    public void setAdapter(PagerAdapter arg0) {
        mAdapter = new InnerPagerAdapter( arg0);
        super.setAdapter( mAdapter);
        setCurrentItem( 1);
    }

    @Override
    public void setOnPageChangeListener(OnPageChangeListener listener) {
        super.setOnPageChangeListener( new InnerOnPageChangeListener( listener));
    }

    private class InnerOnPageChangeListener implements OnPageChangeListener {

        private OnPageChangeListener listener;
        private int position;

        public InnerOnPageChangeListener(OnPageChangeListener listener) {
            this.listener = listener;
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            if(null != listener) {
                listener.onPageScrollStateChanged( arg0);
            }
            if(arg0 == ViewPager.SCROLL_STATE_IDLE) {
                if(position == mAdapter.getCount() - 1) {
                    setCurrentItem( 1, false);
                }
                else if(position == 0) {
                    setCurrentItem( mAdapter.getCount() - 2, false);
                }
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            if(null != listener) {
                listener.onPageScrolled( arg0, arg1, arg2);
            }
        }

        @Override
        public void onPageSelected(int arg0) {
            position = arg0;
            if(null != listener) {
                listener.onPageSelected( arg0);
            }
        }
    }

    private class InnerPagerAdapter extends PagerAdapter {

        private PagerAdapter adapter;

        public InnerPagerAdapter(PagerAdapter adapter) {
            this.adapter = adapter;
            adapter.registerDataSetObserver( new DataSetObserver() {

                @Override
                public void onChanged() {
                    notifyDataSetChanged();
                }

                @Override
                public void onInvalidated() {
                    notifyDataSetChanged();
                }

            });
        }

        @Override
        public int getCount() {
            return adapter.getCount() + 2;
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return adapter.isViewFromObject( arg0, arg1);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            if(position == 0) {
                position = adapter.getCount() - 1;
            }
            else if(position == adapter.getCount() + 1) {
                position = 0;
            }
            else {
                position -= 1;
            }
            return adapter.instantiateItem( container, position);
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            adapter.destroyItem( container, position, object);
        }

    }
}

 以上代码可以直接从GITHUB上获取:https://github.com/vanezkw/cycleviewpager.git

分享到:
评论

相关推荐

    自动无限循环滚动ViewPager

    标题中的“自动无限循环滚动ViewPager”是指一种经过特殊处理的ViewPager,它可以自动以设定的时间间隔切换页面,并且在滑动到末尾时能够平滑地过渡到开头,形成一个无边界的效果,增加用户体验。 实现自动无限循环...

    无限循环滚动ViewPager

    而"无限循环滚动ViewPager"则是在这个基础功能上进行了扩展,使得ViewPager能够无边界地循环显示其内容,即当用户滑动到最后一页时,会无缝跳转回第一页,反之亦然,从而创造出一种无限滚动的视觉体验。 实现无限...

    ViewPager实现循环滚动切换Fragment

    在这个场景下,"ViewPager实现循环滚动切换Fragment"是一个常见的需求,尤其是在轮播广告或者无限滚动的效果中。然而,ViewPager本身并不直接支持循环滚动,因此需要进行额外的定制化工作。 首先,我们需要了解...

    ViewPager+Fragment实现自动循环滚动

    首先,要实现`ViewPager`的循环滚动,常规的`ViewPager`默认是不支持首尾相连的,即不能从第一个页面直接滑到最后一个,反之亦然。但是,通过添加额外的首项和末项,我们可以模拟出这种循环的效果。具体实现方法是在...

    viewpager 实现一屏幕多页循环滚动

    标题"viewpager 实现一屏幕多页循环滚动"涉及到的技术点是如何让ViewPager不仅展示多个页面,而且能够实现循环滚动,即当滑动到最后一页时,会无缝跳转到第一页,反之亦然。这种效果常见于轮播图或者推荐栏等场景。 ...

    ViewPager巧用偷梁换柱实现自动循环滚动

    标题“ViewPager巧用偷梁换柱实现自动循环滚动”暗示我们需要对ViewPager进行一些定制,使其能够自动、无缝地循环滚动。描述中的“简单易用好更改”意味着我们将探讨一种简洁且易于实现的方法来实现这个功能。 首先...

    左右循环滚动的ViewPager

    本项目聚焦于实现“左右循环滚动的ViewPager”,并引入了两个关键库:CircleIndicator和InfiniteViewPager。 **CircleIndicator** 是一个轻量级的库,专门用于配合ViewPager创建圆形的指示器。它为每个页面提供了一...

    ViewPager自动循环滚动

    在许多应用场景,如轮播图、广告展示等,我们希望ViewPager能够实现自动循环滚动,并且能够根据需求设置滚动间隔时间以及在用户触摸时暂停滚动。`ViewPager`本身并不直接支持这些特性,但可以通过扩展`ViewPager`或...

    ViewPager 实现gallery效果+无限循环滚动

    在本教程中,我们将深入探讨如何利用ViewPager实现一个类似画廊(Gallery)的效果,并且让其能够无限循环滚动。 首先,我们要了解ViewPager的基本用法。ViewPager是Android Support Library的一部分,它允许用户在...

    Viewpager左右循环滚动

    **标题解析:**"Viewpager左右循环滚动" 这个标题揭示了我们即将讨论的核心技术,即Android开发中的ViewPager组件,以及如何使它实现左右无限循环的滚动效果。ViewPager是Android SDK中的一个强大的布局管理器,常...

    android-common-master

    (1) 自动循环滚动ViewPager、ViewPager嵌套自动滚动ViewPager (2) 网络缓存Demo (3) 图片缓存Demo,图片SD卡缓存Demo (4) 下拉刷新及滚动到底部加载更多listview Demo (6) Android系统下载管理DownloadManager功能...

    Android-自动循环滚动的Fragment重写viewpager禁止触摸时的滚动简单好用

    实现自动循环滚动的ViewPager,我们需要自定义一个继承自ViewPager的类,例如`AutoLoopViewPager`。在这个类中,我们可以重写`onInterceptTouchEvent`和`onTouchEvent`方法,这两个方法控制了ViewPager对触摸事件的...

    viewpager实现无限循环滚动幻灯片

    在标题"viewpager实现无限循环滚动幻灯片"中,我们要讨论的是如何利用ViewPager实现一个能够无限循环滚动的幻灯片效果,这通常在广告轮播器或类似功能中很有用。 首先,ViewPager本身并不直接支持无限循环,它默认...

    CycleViewPager-可以循环滚动的viewpager.zip

    可以循环滚动播放的ViewPager。即滚动到最后一个item后可直接滚动到第一个item。项目地址:https://github.com/zhaozhentao/CycleViewPager 效果图:

    无限循环的ViewPager

    "无限循环的ViewPager" 是一个Android开发中的特有概念,指的是使用ViewPager组件来实现一种无限轮播的效果。在常规的ViewPager中,用户可以左右滑动查看页面,但其显示的页面数量是有限的。而在无限循环模式下,...

    自动或手动循环滑动ViewPager

    本教程将深入探讨如何实现一个具有自动定时滑动和手动循环滑动功能的ViewPager,以创建类似顶部广告栏的效果。 首先,我们需要理解ViewPager的基本用法。ViewPager继承自PagerAdapter,它通过Adapter来填充数据并...

    自动无限循环的viewpager

    在标题"自动无限循环的viewpager"中,我们关注的核心是将`ViewPager`的滚动行为扩展为自动无限循环。这通常是为了实现类似广告轮播的效果,即当用户达到`ViewPager`的第一个或最后一个页面时,它会自动无缝地滚动回...

    Viewpager和Gallery的循环滚动

    本篇文章将深入探讨如何实现`ViewPager`和`Gallery`的循环滚动功能,这对于创建无限轮播广告、图片浏览等应用场景至关重要。 首先,我们来看`ViewPager`。`ViewPager`是Android Support Library中的一个组件,主要...

    循环ViewPager的两种实现

    然而,标准的ViewPager并不支持循环滚动,即不能在首尾页面之间无缝衔接。这就需要我们对ViewPager进行扩展,实现循环滚动的功能。本篇文章将介绍两种实现循环ViewPager的方法。 方法一:使用PagerAdapter的克隆...

Global site tag (gtag.js) - Google Analytics