ViewPager无限循环的适配器

本文介绍了如何在Android中实现ViewPager的无限循环效果,通常通过在适配器中设置大量Item并定位到中间开始。同时,针对使用层叠效果和无限循环时遇到的问题,警告不要在Fragment的onCreateView()中直接移除ContentView,以避免潜在的显示问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值