Android Fragment+ViewPager实现循环滑动

关于实现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方法里面,不然可能会有一点小停顿


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值