关于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);
}
}
}
});
如果,除了有滑动实现切换的方法外,比如点击按钮也会切换,记得处理好点击按钮的逻辑。