Viewpager完美实现左右循环滑动

来源:互联网 发布:信用信息数据采集制度 编辑:程序博客网 时间:2024/05/17 08:26

大家知道Viewpager在普通的情况下是不能实现循环滑动的,本人在网上看了许多博客,无外乎他们的方法就是把getCount的返回值设置的很大,本人也这样试过,确实可以实现向右循环滑动,但是向左滑动时程序就会挂掉,具体原因我还没找到,如果有哪位大神知道请赐教


好现在讲讲我自己的方法

原理:简单来说就是用到了ViewPager的一个方法setCurrentItem这个方法,我们的数据源也需要作出相应的改变,比原来的情况需要多出2个,这两个多余的分别放在首末的位置,具体为什么要这么做看代码,这样更直观


首先布局,这个很简单都一样不多说

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <android.support.v4.view.ViewPager        android:id="@+id/id_vp"        android:layout_width="match_parent"        android:layout_height="match_parent">            </android.support.v4.view.ViewPager>   </LinearLayout>

PagerAdapter这个也很简单没有什么多讲的,与普通的ViewPager的适配器一样

public class MAdapter extends PagerAdapter {List<ImageView> mDatas;public MAdapter(List<ImageView> datas) {mDatas=datas;}@Overridepublic int getCount() {return mDatas.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0==arg1;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {Log.i("PagerAdapter","destroyItem:"+ position);container.removeView(mDatas.get(position));}@Overridepublic Object instantiateItem(ViewGroup container, int position) {Log.i("PagerAdapter","instantiateItem:"+ position);container.addView(mDatas.get(position));return mDatas.get(position);}}


最后就是我的主要实现代码了
public class MainActivity extends Activity implements OnPageChangeListener{private ViewPager mViewPager;private List<ImageView> mDatas;private PagerAdapter mAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initDatas();mAdapter=new MAdapter(mDatas);mViewPager.setAdapter(mAdapter);mViewPager.setCurrentItem(1);//注意把其实位置设为1mViewPager.setOnPageChangeListener(this);}private void initView() {mViewPager=(ViewPager) findViewById(R.id.id_vp);}private void initDatas(){mDatas=new ArrayList<ImageView>();//这里添加冗余数据,它其实是与倒数第二个数据一模一样ImageView iv0=new ImageView(this);iv0.setBackgroundColor(Color.YELLOW);mDatas.add(iv0);ImageView iv1=new ImageView(this);iv1.setBackgroundColor(Color.RED);mDatas.add(iv1);ImageView iv2=new ImageView(this);iv2.setBackgroundColor(Color.BLUE);mDatas.add(iv2);ImageView iv3=new ImageView(this);iv3.setBackgroundColor(Color.GREEN);mDatas.add(iv3);ImageView iv4=new ImageView(this);iv4.setBackgroundColor(Color.YELLOW);mDatas.add(iv4);//这里也是冗余数据,它与第二的数据是一模一样的,具体什么说用看onPageScrolled方法就知道了ImageView iv5=new ImageView(this);iv5.setBackgroundColor(Color.RED);mDatas.add(iv5);}@Overridepublic void onPageScrollStateChanged(int state) {}//完美实现左滑右滑@Overridepublic void onPageScrolled(int position, float offsetPerc, int offsetPixel) {Log.i("TAG", "position="+position+" offsetPerc="+offsetPerc);//关键地方自己好好琢磨if(position==0){if (offsetPerc==0) {mViewPager.setCurrentItem(mDatas.size()-2, false);}}if (position==mDatas.size()-1) {if(offsetPerc==0){mViewPager.setCurrentItem(1, false);}}}@Overridepublic void onPageSelected(int position) {     }}



0 0
原创粉丝点击