通常我们使用的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