循環スクロールViewPager
通常、私たちが使用しているViewPagerが実現した左右のスライドは循環して転がることができなくて、頭や尾に着いた時、頭をやり直すことができなくて、インターネットでいくつかの資料を集めて、CycleViewPagerを見つけて左右の循環スクロールを実現することができて、実現も比較的に簡単で、直接コードを貼ります:
プライマリファイル:
CycleViewPager:
以上のコードはGITHUBから直接取得できます.https://github.com/vanezkw/cycleviewpager.git
プライマリファイル:
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