xiaohaibin / XBanner

:fire:【图片轮播】支持图片无限轮播,支持AndroidX、自定义指示点、显示提示文字、切换动画、自定义布局,一屏多显、视频图片混合轮播等功能
Apache License 2.0
2.17k stars 349 forks source link

IndexOutOfBoundsException 数组越界 #196

Closed LiuDongCai closed 3 years ago

LiuDongCai commented 3 years ago

xbanner版本:com.github.xiaohaibin:XBanner:androidx_v1.1.2

java.lang.IndexOutOfBoundsException: Index: 6, Size: 6 at java.util.ArrayList.get(ArrayList.java:437) at com.stx.xhb.androidx.XBanner$XBannerPageAdapter.instantiateItem(SourceFile:845) at androidx.viewpager.widget.ViewPager.addNewItem(SourceFile:1010) at androidx.viewpager.widget.ViewPager.populate(SourceFile:1224) at androidx.viewpager.widget.ViewPager.populate(SourceFile:1092) at androidx.viewpager.widget.ViewPager.onMeasure(SourceFile:1622) at android.view.View.measure(View.java:22002) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) at android.view.View.measure(View.java:22002) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514) at android.widget.LinearLayout.measureVertical(LinearLayout.java:806) at android.widget.LinearLayout.onMeasure(LinearLayout.java:685) at android.view.View.measure(View.java:22002) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) at android.view.View.measure(View.java:22002) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at androidx.appcompat.widget.ContentFrameLayout.onMeasure(SourceFile:143) at android.view.View.measure(View.java:22002) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514) at android.widget.LinearLayout.measureVertical(LinearLayout.java:806) at android.widget.LinearLayout.onMeasure(LinearLayout.java:685) at android.view.View.measure(View.java:22002) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at android.view.View.measure(View.java:22002) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514) at android.widget.LinearLayout.measureVertical(LinearLayout.java:806) at android.widget.LinearLayout.onMeasure(LinearLayout.java:685) at android.view.View.measure(View.java:22002) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at com.android.internal.policy.DecorView.onMeasure(DecorView.java:721) at android.view.View.measure(View.java:22002) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2422) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1506) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1763) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1394) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6770) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966) at android.view.Choreographer.doCallbacks(Choreographer.java:778) at android.view.Choreographer.doFrame(Choreographer.java:713) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:169) at android.app.ActivityThread.main(ActivityThread.java:6578) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) Back traces ends.

xiaohaibin commented 3 years ago

更新下版本,最新版本是1.1.3

LiuDongCai commented 3 years ago

好的,新版本已经解决了是吗

xiaohaibin commented 3 years ago

对的

LiuDongCai commented 3 years ago

升级1.1.3之后

LiuDongCai commented 3 years ago

Process Name: 'com.addcn.android.house591' Thread Name: 'main' Back traces starts. java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 21, found: 30 Pager id: ffffffff Pager class: class com.stx.xhb.androidx.XBannerViewPager Problematic adapter: class com.stx.xhb.androidx.XBanner$XBannerPageAdapter at androidx.viewpager.widget.ViewPager.populate(SourceFile:1143) at androidx.viewpager.widget.ViewPager.populate(SourceFile:1092) at androidx.viewpager.widget.ViewPager.onMeasure(SourceFile:1622) at android.view.View.measure(View.java:24567) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:735) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481) at android.view.View.measure(View.java:24567) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552) at android.widget.LinearLayout.measureVertical(LinearLayout.java:842) at android.widget.LinearLayout.onMeasure(LinearLayout.java:721) at android.view.View.measure(View.java:24567) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:735) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481) at android.view.View.measure(View.java:24567) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at androidx.appcompat.widget.ContentFrameLayout.onMeasure(SourceFile:143) at android.view.View.measure(View.java:24567) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552) at android.widget.LinearLayout.measureVertical(LinearLayout.java:842) at android.widget.LinearLayout.onMeasure(LinearLayout.java:721) at android.view.View.measure(View.java:24567) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.view.View.measure(View.java:24567) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552) at android.widget.LinearLayout.measureVertical(LinearLayout.java:842) at android.widget.LinearLayout.onMeasure(LinearLayout.java:721) at android.view.View.measure(View.java:24567) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at com.android.internal.policy.DecorView.onMeasure(DecorView.java:753) at android.view.View.measure(View.java:24567) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3007) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1834) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2123) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1722) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7621) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1029) at android.view.Choreographer.doCallbacks(Choreographer.java:852) at android.view.Choreographer.doFrame(Choreographer.java:787) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1014) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:235) at android.app.ActivityThread.main(ActivityThread.java:7441) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) Back traces ends.

xiaohaibin commented 3 years ago

你的调用方式是啥

LiuDongCai commented 3 years ago

image

LiuDongCai commented 3 years ago

上面是初始化

下面是调用 image

LiuDongCai commented 3 years ago

每次移动地图,都会重新设置dataList,然后重新调用

xiaohaibin commented 3 years ago

每次刷新后就会报这个错么,正常调用这个方法,viewpager已经重新创建了应该不会导致这个问题

LiuDongCai commented 3 years ago

我这边调试没出现,但是线上用户会出现

1.1.2版本不会,升级1.1.3之后就出现了

xiaohaibin commented 3 years ago

出现问题的设备型号是啥,我复现看看

LiuDongCai commented 3 years ago

image image image image

LiuDongCai commented 3 years ago

image image

LiuDongCai commented 3 years ago

感觉是刷新设置不同数目的data进去导致的?

xiaohaibin commented 3 years ago

对,这样,你在调用setbannerData方法之后获取viewpager的适配器调用notify试试,我一直没复现出来,因为本身这个方法里面已经重建viewpager,再次设置数据已经是新的适配器了

LiuDongCai commented 3 years ago

好,不过我也没复现,不知道这样设置有无效果,你那边sdk也加一个notifydata?这样好像比较保险。 目前线上我是降到了1.1.2的,后面我再看下改一下。

binbinyYang commented 3 years ago

作者你好,我是楼上提问题人的同事,最近发现还是会出现这个问题 Process Name: 'com.addcn.android.house591' Thread Name: 'main' Back traces starts. java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 15, found: 16 Pager id: ffffffff Pager class: class com.stx.xhb.androidx.XBannerViewPager Problematic adapter: class com.stx.xhb.androidx.XBanner$XBannerPageAdapter at androidx.viewpager.widget.ViewPager.populate(SourceFile:1143) at androidx.viewpager.widget.ViewPager.populate(SourceFile:1092) at androidx.viewpager.widget.ViewPager.onMeasure(SourceFile:1622) at android.view.View.measure(View.java:27131) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:735) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481) at android.view.View.measure(View.java:27131) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:735) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481) at android.view.View.measure(View.java:27131) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552) at android.widget.LinearLayout.measureVertical(LinearLayout.java:842) at android.widget.LinearLayout.onMeasure(LinearLayout.java:721) at android.view.View.measure(View.java:27131) at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:2362) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.widget.ScrollView.onMeasure(ScrollView.java:701) at android.view.View.measure(View.java:27131) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.view.View.measure(View.java:27131) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:735) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481) at android.view.View.measure(View.java:27131) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:735) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481) at android.view.View.measure(View.java:27131) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at androidx.appcompat.widget.ContentFrameLayout.onMeasure(SourceFile:143) at android.view.View.measure(View.java:27131) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552) at android.widget.LinearLayout.measureVertical(LinearLayout.java:842) at android.widget.LinearLayout.onMeasure(LinearLayout.java:721) at android.view.View.measure(View.java:27131) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.view.View.measure(View.java:27131) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552) at android.widget.LinearLayout.measureVertical(LinearLayout.java:842) at android.widget.LinearLayout.onMeasure(LinearLayout.java:721) at android.view.View.measure(View.java:27131) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7951) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at com.android.internal.policy.DecorView.onMeasure(DecorView.java:1173) at android.view.View.measure(View.java:27131) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:4139) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2893) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3156) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2575) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9910) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1010) at android.view.Choreographer.doCallbacks(Choreographer.java:809) at android.view.Choreographer.doFrame(Choreographer.java:744) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:995) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8506) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) Back traces ends.

代码方面我已经是setBannerData for(int i =0;i<mDetailPhotoList.size();i++){ BannerImgInfo bannerImgInfo = new BannerImgInfo(mDetailPhotoList.get(i)); bannerImgInfoArrayList.add(bannerImgInfo); } mPager.setBannerData(R.layout.fragment_house_detail_pic_other,bannerImgInfoArrayList);

xiaohaibin commented 3 years ago

版本是最新的吗

binbinyYang commented 3 years ago

com.github.xiaohaibin:XBanner:androidx_v1.1.2',

binbinyYang commented 3 years ago

作者 能看看是什么问题导致的吗 还是报这个错

xiaohaibin commented 3 years ago

更新到最新的版本试试呢,偶现还是必现的,这个,本地能复现嘛

xiaohaibin commented 3 years ago

https://www.cnblogs.com/Sharley/p/9166675.html 参考这个试试

binbinyYang commented 3 years ago

现在用的是V1.1.2我在自己代码里面加了 notifyDataSetChanged 如下代码 for(int i =0;i<mDetailPhotoList.size();i++){ BannerImgInfo bannerImgInfo = new BannerImgInfo(mDetailPhotoList.get(i)); bannerImgInfoArrayList.add(bannerImgInfo); }

                mPager.setBannerData(R.layout.fragment_house_detail_pic_other,bannerImgInfoArrayList);
                if(mPager.getViewPager()!=null && mPager.getViewPager().getAdapter()!=null) {
                    mPager.getViewPager().getAdapter().notifyDataSetChanged();
                }
binbinyYang commented 3 years ago

for(int i =0;i<mDetailPhotoList.size();i++){ BannerImgInfo bannerImgInfo = new BannerImgInfo(mDetailPhotoList.get(i)); bannerImgInfoArrayList.add(bannerImgInfo); }

                mPager.setBannerData(R.layout.fragment_house_detail_pic_other,bannerImgInfoArrayList);
                if(mPager.getViewPager()!=null && mPager.getViewPager().getAdapter()!=null) {
                    mPager.getViewPager().getAdapter().notifyDataSetChanged();
                }
binbinyYang commented 3 years ago

拿到数据集合 bannerImgInfoArrayList 然后 setBannerData 然后在判断 后notifyDataSetChanged

xiaohaibin commented 3 years ago

这样设置还是不行么

binbinyYang commented 3 years ago

是的 还是在一直报错 友盟统计的崩溃率一直有 我此时此刻在公司看的数据

binbinyYang commented 3 years ago

作者你好 方便加你微信吗 针对这个问题一直在报错 有点困扰我们,我能复现出这个崩溃bug

xiaohaibin commented 3 years ago

已处理