关于ViewPager无限循环问题

If this cover violates your rights, please contact me

背景:最近为了完善音乐播放器的滑动播放功能,选择在展开这方面的尝试。

对于题目展示的问题,根据网上资料总结一共有三种办法。

第一种:通过设置ViewPager的Adapter的getCount方法,返回Integer.MAX_VALUE,获得无限多的Item,造成一种伪循环的效果。

但实际在尝试中感觉并不理想,尤其是ViewPager的Item中含有动画时,容易造成ANR,即使选择getCount中乘以40倍的Size返回也容易造成ANR。

第二种:通过对数据首尾互相添加假数据的效果,然后通过setCurrentItem实现无限循环的方法。(smoothScroll选择false,取消动画)

    mSongs.addAll(songList);
    //丑陋地添加首尾数据的代码
    
    Song temp1 = mSongs.get(0);
    Song temp2 = mSongs.get(mSongs.size() - 1);

    mSongs.add(0, temp2);
    mSongs.add(mSongs.size(), temp1);

这里,我选择在传入数据时,通过代码添加。接下来就是,可以选择在ViewPager的onPageScrollStateChanged使用setCurrentItem方法了,不过还建议在onPageSelected中设置一个boolean,判断是否在滑动以节省资源。

        @Override
        public void onPageSelected(int position) {
        	    //选择取消唱片动画
        	    //回调提醒Song已经改变
            mIsChanged = true;
            if (position > currentItem) {
                notifyMusicStatusChanged(MusicChangedStatus.NEXT);
            } else {
                notifyMusicStatusChanged(MusicChangedStatus.LAST);
            }

            if(position == 0){
                currentItem = mSongs.size()-2;
            }else if(position== mSongs.size()-1){
                currentItem = 1;
            }else {
                currentItem = position;
            }

        }

        @Override
        public void onPageScrollStateChanged(int state) {

            if (state == ViewPager.SCROLL_STATE_IDLE) {
                //动画

                //防止在Scroll时,再次更新动画导致,发生ANR
                if (mIsChanged) {
                    mIsChanged = false;
                    mVpContain.setCurrentItem(currentItem, false);
                }
            }
        }
    });

如果,除了有滑动实现切换的方法外,比如点击按钮也会切换,记得处理好点击按钮的逻辑。

第三种:其实是第二种的变种,选择在ViewPager的Adapter的finishUpdate中完成setCurrentItem方法,这种方法应该比第二种更能节省资源,同时也不需要多一个量记录ViewPager是否在动画中。