美文网首页
Viewpager无限轮循

Viewpager无限轮循

作者: duoduo7628 | 来源:发表于2019-08-07 11:02 被阅读0次

方法有两种

  • 第一种
    1.在数据首尾添加数据
    private void initData() {

        mList = new ArrayList<>();
        mList.add(new MyData(5));
        for (int i = 0; i < 5; i++) {

            MyData myData = new MyData();
            myData.setIndex(i+1);
            mList.add(myData);
        }
        mList.add(new MyData(1));
    }
  • 当滑动话第一个item,就setCurrentItem为倒数第二个。
  • 当滑动到最后一个事,就设置 setCurrentItem为第二个。

    @Override
    public void onPageScrollStateChanged(int state) {

        if(state == ViewPager.SCROLL_STATE_SETTLING){
            //结束

            Log.e(TAG, "onPageScrollStateChanged: state = ViewPager.SCROLL_STATE_SETTLING ");


        }else if(state == ViewPager.SCROLL_STATE_DRAGGING){

            //滑动中
            Log.e(TAG, "onPageScrollStateChanged: state = ViewPager.SCROLL_STATE_DRAGGING" );

        }else if(state == ViewPager.SCROLL_STATE_IDLE){
            //静止状态
            Log.e(TAG, "onPageScrollStateChanged: state = ViewPager.SCROLL_STATE_IDLE" );

            //有的博文会监听positionOffset = 0,测试发现这里监听最稳定
            if(mViewPager.getCurrentItem() == 0){

                mViewPager.setCurrentItem(mList.size() - 2,false);
            }else if(mViewPager.getCurrentItem() == mList.size() -1){

                mViewPager.setCurrentItem(1,false);
            }
        }
    }

缺点:不适用于一屏显示多个item 并且有缩放、渐变等动画的item。

  • 第二种
    1.设置adapter getCount()返回Integer.MAX_VALUE
    2.getItem设置对应的View或数据
package com.noah.testviewpager;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;

import java.util.List;

public class MyMaxPageAdapter extends FragmentStatePagerAdapter {


    private List<MyData> mList;

    public MyMaxPageAdapter(FragmentManager fm , List<MyData> mList) {
        super(fm);
        this.mList = mList;

    }

    @Override
    public Fragment getItem(int i) {
        return MyFragment.getInstance(mList.get(i % mList.size()));
    }

    @Override
    public int getCount() {
        return mList != null && mList.size() > 0 ? Integer.MAX_VALUE : 0;
    }
}

直接设置adapter

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
        mViewPager = findViewById(R.id.viewpager);
        MyMaxPageAdapter myMaxPageAdapter = new MyMaxPageAdapter(getSupportFragmentManager(),mList);
        mViewPager.setAdapter(myMaxPageAdapter);
        mViewPager.setCurrentItem(mList != null ? mList.size() * 50 : 0,false);

    }

优点:这个再有动画的时候,无限循环也可以正常显示。

相关文章

网友评论

      本文标题:Viewpager无限轮循

      本文链接:https://www.haomeiwen.com/subject/rrstrctx.html