twoway-view icon indicating copy to clipboard operation
twoway-view copied to clipboard

IndexOutOfBoundsException Invalid item position XX(XX). Item count:XX

Open jacek-marchwicki opened this issue 9 years ago • 10 comments

java.lang.IndexOutOfBoundsException: Invalid item position 53(53). Item count:15
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3263)
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3258)
            at org.lucasr.twowayview.TwoWayLayoutManager.makeAndAddView(TwoWayLayoutManager.java:466)
            at org.lucasr.twowayview.TwoWayLayoutManager.fillSpecific(TwoWayLayoutManager.java:279)
            at org.lucasr.twowayview.TwoWayLayoutManager.onLayoutChildren(TwoWayLayoutManager.java:705)
            at org.lucasr.twowayview.widget.BaseLayoutManager.onLayoutChildren(BaseLayoutManager.java:326)
            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1918)
            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2155)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:502)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
            at android.view.View.layout(View.java:14817)
            at android.view.ViewGroup.layout(ViewGroup.java:4631)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1983)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1740)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:544)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

I found solution to easy reproduce this issue: https://github.com/jacek-marchwicki/twoway-view/tree/bug2-reproducer Just please scroll down on the list.

jacek-marchwicki avatar Oct 23 '14 14:10 jacek-marchwicki

also:

    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 57(offset:57).state:95
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3300)
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3258)
            at org.lucasr.twowayview.TwoWayLayoutManager.makeAndAddView(TwoWayLayoutManager.java:469)
            at org.lucasr.twowayview.TwoWayLayoutManager.fillAfter(TwoWayLayoutManager.java:269)
            at org.lucasr.twowayview.TwoWayLayoutManager.fillGap(TwoWayLayoutManager.java:237)
            at org.lucasr.twowayview.TwoWayLayoutManager.scrollBy(TwoWayLayoutManager.java:226)
            at org.lucasr.twowayview.TwoWayLayoutManager.scrollVerticallyBy(TwoWayLayoutManager.java:783)
            at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:2715)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:543)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

jacek-marchwicki avatar Oct 23 '14 14:10 jacek-marchwicki

For the first one I found simple solution:

diff --git a/core/src/main/java/org/lucasr/twowayview/TwoWayLayoutManager.java b/core/src/main/java/org/lucasr/twowa
index 543574c..81e5aea 100644
--- a/core/src/main/java/org/lucasr/twowayview/TwoWayLayoutManager.java
+++ b/core/src/main/java/org/lucasr/twowayview/TwoWayLayoutManager.java
@@ -275,6 +275,9 @@ public abstract class TwoWayLayoutManager extends LayoutManager {
         if (state.getItemCount() == 0) {
             return;
         }
+        if (position >= state.getItemCount()) {
+            return;
+        }

         makeAndAddView(position, Direction.END, recycler);

but I'm not sure if it is correct, @lucasr what do you think about this?

jacek-marchwicki avatar Oct 23 '14 14:10 jacek-marchwicki

For the second I think this might be corelated with: https://code.google.com/p/android/issues/detail?id=77846

jacek-marchwicki avatar Oct 23 '14 15:10 jacek-marchwicki

I've been seeing a similar issue, when I remove the first item in an adapter (position 0), and then call notifyItemRemoved(0). If I change it to notifyDataSetChanged() I have no problem, but with notifyItemRemoved(0) I get this crash:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 0(offset:-1).state:2 at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3300) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3258) at org.lucasr.twowayview.TwoWayLayoutManager.makeAndAddView(TwoWayLayoutManager.java:466) at org.lucasr.twowayview.TwoWayLayoutManager.fillBefore(TwoWayLayoutManager.java:256) at org.lucasr.twowayview.TwoWayLayoutManager.fillBefore(TwoWayLayoutManager.java:249) at org.lucasr.twowayview.TwoWayLayoutManager.correctTooHigh(TwoWayLayoutManager.java:335) at org.lucasr.twowayview.TwoWayLayoutManager.fillSpecific(TwoWayLayoutManager.java:301) at org.lucasr.twowayview.TwoWayLayoutManager.onLayoutChildren(TwoWayLayoutManager.java:725) at org.lucasr.twowayview.widget.BaseLayoutManager.onLayoutChildren(BaseLayoutManager.java:369) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1872) at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2155) at android.view.View.layout(View.java:14937) at android.view.ViewGroup.layout(ViewGroup.java:4651) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14937) at android.view.ViewGroup.layout(ViewGroup.java:4651) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14937) at android.view.ViewGroup.layout(ViewGroup.java:4651) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14937) at android.view.ViewGroup.layout(ViewGroup.java:4651) at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:887) at android.view.View.layout(View.java:14937) at android.view.ViewGroup.layout(ViewGroup.java:4651) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14937) at android.view.ViewGroup.layout(ViewGroup.java:4651) at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:502) at android.view.View.layout(View.java:14937) at android.view.ViewGroup.layout(ViewGroup.java:4651) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14937) at android.view.ViewGroup.layout(ViewGroup.java:4651) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525) at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) at android.view.View.layout(View.java:14937) at android.view.ViewGroup.layout(ViewGroup.java:4651) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:14937) at android.view.ViewGroup.layout(ViewGroup.java:4651) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2132) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1872) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1075) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5878) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:544) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136)

eygraber avatar Nov 12 '14 00:11 eygraber

I have this same issue, calling notifyItemRemoved(0) will crash, anyone knows if this is a recyclerview bug?

lvguowei avatar Dec 05 '14 13:12 lvguowei

Now I am doing some dirty workaround like if (index == 0) {notifydatasetchange();} else {notifyItemRemoved(index)}

lvguowei avatar Dec 05 '14 13:12 lvguowei

It is indeed a RecyclerView bug and is yet to be fixed.

For more information check: https://code.google.com/p/android/issues/detail?id=77846 https://code.google.com/p/android/issues/detail?id=77232

mradzinski avatar Jan 11 '15 15:01 mradzinski

I have found the same issue, calling notifyItemRemoved(0) will crash with exception IndexOutOfBoundsException

shailendraborse avatar Mar 16 '15 07:03 shailendraborse

Below exception arises when I was going to delete item at 0 postion in GridLayoutManager , StaggeredGridLayoutManager and SpannableGridLayoutManager.

Process: org.lucasr.twowayview.sample, PID: 21165 java.lang.ArrayIndexOutOfBoundsException: length=22; index=-1 at org.lucasr.twowayview.widget.ItemEntries.getItemEntry(ItemEntries.java:69) at org.lucasr.twowayview.widget.BaseLayoutManager.getItemEntryForPosition(BaseLayoutManager.java:213) at org.lucasr.twowayview.widget.SpannableGridLayoutManager.cacheChildLaneAndSpan(SpannableGridLayoutManager.java:216) at org.lucasr.twowayview.widget.BaseLayoutManager.measureChild(BaseLayoutManager.java:474) at org.lucasr.twowayview.TwoWayLayoutManager.setupChild(TwoWayLayoutManager.java:461) at org.lucasr.twowayview.TwoWayLayoutManager.fillFromScrapList(TwoWayLayoutManager.java:449) at org.lucasr.twowayview.TwoWayLayoutManager.onLayoutScrapList(TwoWayLayoutManager.java:740) at org.lucasr.twowayview.widget.BaseLayoutManager.onLayoutScrapList(BaseLayoutManager.java:375) at org.lucasr.twowayview.TwoWayLayoutManager.onLayoutChildren(TwoWayLayoutManager.java:727) at org.lucasr.twowayview.widget.BaseLayoutManager.onLayoutChildren(BaseLayoutManager.java:369) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1918) at android.support.v7.widget.RecyclerView.resumeRequestLayout(RecyclerView.java:1101) at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:155) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:543) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method)

shailendraborse avatar Mar 16 '15 09:03 shailendraborse

Still happening in @lucasr master, even with @jacek-marchwicki changes

I am using SpannableGridLayoutManager and notifyItemRangeRemoved(0, length).

This issue got fixed in Google's StaggeredGridLayoutManager in RecyclerView 21.0.2. (I could not reproduce anymore at least)

I tried to fix it, but no lucky =/

Hazer avatar May 04 '15 08:05 Hazer