xiwenhec / Banner

android广告轮播控件
58 stars 21 forks source link

StackOverFlow了,循环的调用setCurrentItem()方法 #12

Open MrTrying opened 6 years ago

MrTrying commented 6 years ago

当position是最后一个的时候调用setCurrentItem()方法就会出现这个问题。

W:     at acore.widget.banner.SLooperViewPager.setCurrentItem(SLooperViewPager.java:52)
W:     at acore.widget.banner.SLooperViewPager$1.onPageScrolled(SLooperViewPager.java:119)
W:     at android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1950)
W:     at android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1924)
W:     at android.support.v4.view.ViewPager.pageScrolled(ViewPager.java:1845)
W:     at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:693)
W:     at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:669)
W:     at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:630)
W:     at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:622)
W:     at acore.widget.banner.SLooperViewPager.setCurrentItem(SLooperViewPager.java:52)
W:     at acore.widget.banner.SLooperViewPager$1.onPageScrolled(SLooperViewPager.java:119)
W:     at android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1950)
W:     at android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1924)
W:     at android.support.v4.view.ViewPager.pageScrolled(ViewPager.java:1845)
W:     at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:693)
W:     at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:669)
W:     at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:630)
W:     at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:622)

SLooperAdapter中mOnPageChangeListener的onPageScrolled方法 原始代码

/*
positionOffset =0:滚动完成,
position =0 :开始的边界
position =mSLooperAdapter.getCount()-1:结束的边界
*/
if (positionOffset == 0 && mPreviousOffset == 0 && (position == 0 || position == mSLooperAdapter.getCount() - 1)) {
    //强制回到映射位置
    setCurrentItem(innerPosition, false);
}

修改后

/*
positionOffset =0:滚动完成,
position =0 :开始的边界
position =mSLooperAdapter.getCount():结束的边界
*/
if (positionOffset == 0 && mPreviousOffset == 0 && (position == 0 || position == mSLooperAdapter.getCount())) {
    //强制回到映射位置
    setCurrentItem(innerPosition, false);
}
MrTrying commented 6 years ago

那个InnerPageAdapter没有绑定数据,数据更新的时候有可能导致数据不一致,然后会StackOverFlow,这个还是有必要处理一下啊