关于实现ViewPager循环滑动的方法有几种,之前用过加最大值的方法,但是有点问题,所以本篇文章主要介绍的是前后各加一个项的方法,首先看代码(布局代码我就不贴出来了,太简单了,就是一个viewpager)
package com.pager.demo;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import android.view.MenuItem;
import com.pager.demo.fragment.AFragment;
import com.pager.demo.fragment.BFragment;
import com.pager.demo.fragment.CFragment;
public class MainActivity extends FragmentActivity {
private ViewPager myViewPager;
private List<Fragment> mListViews;
private boolean mIsChanged = false;
private int mCurrentPagePosition = FIRST_ITEM_INDEX;
private static final int POINT_LENGTH = 3;
private static final int FIRST_ITEM_INDEX = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListViews = new ArrayList<Fragment>();
mListViews.add(new CFragment());
mListViews.add(new AFragment());
mListViews.add(new BFragment());
mListViews.add(new CFragment());
mListViews.add(new AFragment());
myViewPager = (ViewPager) findViewById(R.id.viewpager);
myViewPager.setAdapter(MyPagerAdapter);
myViewPager.setCurrentItem(1, false);
myViewPager.addOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int pPosition) {
mIsChanged = true;
if (pPosition > POINT_LENGTH) {// 末位之后,跳转到首位(1)
mCurrentPagePosition = FIRST_ITEM_INDEX;
} else if (pPosition < FIRST_ITEM_INDEX) {// 首位之前,跳转到末尾(N)
mCurrentPagePosition = POINT_LENGTH;
} else {
mCurrentPagePosition = pPosition;
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int pState) {
if (ViewPager.SCROLL_STATE_IDLE == pState) {
if (mIsChanged) {
mIsChanged = false;
myViewPager.setCurrentItem(mCurrentPagePosition, false);
}
}
}
});
}
private FragmentPagerAdapter MyPagerAdapter = new FragmentPagerAdapter(
getSupportFragmentManager()) {
@Override
public int getCount() {
return mListViews.size();
}
@Override
public Fragment getItem(int arg0) {
return mListViews.get(arg0);
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
其中有两个地方要特别注意
第一个是这段代码
mListViews.add(new CFragment());
mListViews.add(new AFragment());
mListViews.add(new BFragment());
mListViews.add(new CFragment());
mListViews.add(new AFragment());
其实我们能看到的页面就只有AFragment,BFragment,CFragment三个页面,但实际上有5个,在原来三个的基础上,把原来的最后一个加到最先,把原来的最先加到最后,就像上面那段代码一样,
第二个地方就是滑动监听的方法了
myViewPager.addOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int pPosition) {
mIsChanged = true;
if (pPosition > POINT_LENGTH) {// 末位之后,跳转到首位(1)
mCurrentPagePosition = FIRST_ITEM_INDEX;
} else if (pPosition < FIRST_ITEM_INDEX) {// 首位之前,跳转到末尾(N)
mCurrentPagePosition = POINT_LENGTH;
} else {
mCurrentPagePosition = pPosition;
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int pState) {
if (ViewPager.SCROLL_STATE_IDLE == pState) {
if (mIsChanged) {
mIsChanged = false;
myViewPager.setCurrentItem(mCurrentPagePosition, false);
}
}
}
});
看注释大家应该都能知道是什么意思了,不过有一点要注意一下,setCurrentItem方法的第二个参数一定要设置false,不然会显示跳转过程的动画,这样看起来会不是那种连贯的效果,还有就是setCurrentItem这一步最好放到onPageScrollStateChanged方法里面,不然可能会有一点小停顿