ViewPager无限循环,一般的是在适配器里设置Item的个数很大,然后设置当前的Item是中间位置的第一个。
这里做个记录:
public class BaseFragmentPagerAdapter extends android.support.v4.app.FragmentPagerAdapter {
private List<Fragment> mFragments;
private String[] mTitles;
private int MAX_NUM = 10000; //这个数字可以根据情况自由修改,但不能超过 Int 的最大值
public BaseFragmentPagerAdapter(FragmentManager fm, List<Fragment> mFragments) {
super(fm);
this.mFragments = mFragments;
// this.mTitles = mTitles;
}
@Override
public Fragment getItem(int position) {
int realPosition = getRealPosition(position);
return mFragments.get(realPosition);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, getRealPosition(position));
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, getRealPosition(position), object);
}
@Override
public int getCount() {
// return mFragments != null ? mFragments.size() : 0;
return mFragments != null ? mFragments.size() * MAX_NUM : MAX_NUM;
}
public int getRealCount() {
return mFragments != null ? mFragments.size() : 0;
}
public int getRealPosition(int position) {
return position % getRealCount();
}
public int getCenterValue(){
int currentItem;
//获得中间值,你的ViewPager才能向左滑动基础
currentItem= (MAX_NUM/2);
if(currentItem % getRealCount() ==0 ){
return currentItem;
}
// 直到找到从0开始的位置
while (currentItem % getRealCount() != 0){
currentItem++;
}
return currentItem;
}
// @Override
// public CharSequence getPageTitle(int position) {
// int realPosition = getRealPosition(position);
// return mTitles != null || mTitles.length > realPosition ? mTitles[realPosition] : "";
// }
}
使用:
//获取中间位置的第一个Fragment
int centerValue = mAdapter.getCenterValue();
viewPager.setAdapter(mAdapter);
viewPager.setCurrentItem(centerValue,false);
踩坑,如果要使用层叠效果加上无限循环的话,不要在Fragment的 onCreateView()中 使用viewGroup.removeView(contentView:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//去掉注释的部分
// if (contentView != null) {
// ViewGroup viewGroup = (ViewGroup) contentView.getParent();
// if (viewGroup != null) {
// **viewGroup.removeView(contentView);**
// }
// } else {
contentView = inflater.inflate(resId, container, false);
// }
return contentView;
}