Anki-Android
Anki-Android copied to clipboard
CardBrowser RecyclerView IndexOutOfBoundsException
Checked for duplicates?
- [x] This issue is not a duplicate
Does it also happen in the desktop version?
- [x] This bug does not occur in the latest version of Anki Desktop
What are the steps to reproduce this bug?
https://ankidroid.org/acra/app/1/bug/274610/report/2e3f2f38-2443-4980-b4c9-28510b7a9f75
Not sure exactly how this can happen but it did, here's the decoded stack trace from ACRA via proguard mappings:
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 7(offset:7).state:229745 androidx.recyclerview.widget.RecyclerView{abcdc37 VFED..... ......ID 0,356-1080,2161 #7f0a013c app:id/card_browser_list}, adapter:Q3.e@d3c66f2, layout:androidx.recyclerview.widget.LinearLayoutManager@70cb5a4, context:com.ichi2.anki.CardBrowser@c10e656
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6821)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6757)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6753)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2362)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1662)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1622)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:687)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4645)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4348)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4919)
at android.view.View.layout(View.java:23814)
at android.view.ViewGroup.layout(ViewGroup.java:6428)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:23814)
at android.view.ViewGroup.layout(ViewGroup.java:6428)
at androidx.coordinatorlayout.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1213)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:899)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:919)
at android.view.View.layout(View.java:23814)
at android.view.ViewGroup.layout(ViewGroup.java:6428)
at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1263)
at android.view.View.layout(View.java:23814)
at android.view.ViewGroup.layout(ViewGroup.java:6428)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23814)
at android.view.ViewGroup.layout(ViewGroup.java:6428)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23814)
at android.view.ViewGroup.layout(ViewGroup.java:6428)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23814)
at android.view.ViewGroup.layout(ViewGroup.java:6428)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:23814)
at android.view.ViewGroup.layout(ViewGroup.java:6428)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:830)
at android.view.View.layout(View.java:23814)
at android.view.ViewGroup.layout(ViewGroup.java:6428)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:4161)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3538)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2476)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9303)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
at android.view.Choreographer.doCallbacks(Choreographer.java:899)
at android.view.Choreographer.doFrame(Choreographer.java:832)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
at android.os.Handler.handleCallback(Handler.java:984)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loopOnce(Looper.java:238)
at android.os.Looper.loop(Looper.java:357)
at android.app.ActivityThread.main(ActivityThread.java:8088)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:957)
here is the logcat but the crash is not in here for some reason
01-07 22:34:11.171 I/AnkiDroid(19831): setting deck: 1646049683064
01-07 22:34:11.174 I/AnkiDroid(19831): initCompleted
01-07 22:34:11.530 W/AnkiDroid(19831): h3/ blocked main thread for 315ms:
01-07 22:34:11.530 W/AnkiDroid(19831): M3.h3.j(SourceFile:61)
01-07 22:34:11.543 I/AnkiDroid(19831): DeckPicker::onStop
01-07 22:34:11.546 I/AnkiDroid(19831): DeckPicker::onSaveInstanceState
01-07 22:34:11.565 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully
01-07 22:34:19.962 I/AnkiDroid(19831): CardBrowser::onPause
01-07 22:34:19.975 I/AnkiDroid(19831): Setting theme to BLACK
01-07 22:34:19.977 I/AnkiDroid(19831): SingleFragmentActivity::onCreate
01-07 22:34:19.979 I/AnkiDroid(19831): isLegacyStorage(): current dir: /storage/emulated/0/Android/data/com.ichi2.anki/files/AnkiDroid
01-07 22:34:19.979 I/AnkiDroid(19831): scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki/files
01-07 22:34:19.979 I/AnkiDroid(19831): scoped internal dir: /data/user/0/com.ichi2.anki/files
01-07 22:34:19.979 I/AnkiDroid(19831): isLegacyStorage(): false
01-07 22:34:19.982 I/AnkiDroid(19831): SingleFragmentActivity::onStart
01-07 22:34:19.982 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onAttach
01-07 22:34:19.983 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onCreate
01-07 22:34:20.016 I/AnkiDroid(19831): onCollectionLoaded() Edit note activity successfully started with card id 1733678638047
01-07 22:34:20.020 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onViewCreated
01-07 22:34:20.020 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStart
01-07 22:34:20.022 I/AnkiDroid(19831): SingleFragmentActivity::onResume
01-07 22:34:20.023 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onResume
01-07 22:34:20.107 I/AnkiDroid(19831): CardBrowser::onStop
01-07 22:34:20.108 I/AnkiDroid(19831): CardBrowser::onSaveInstanceState
01-07 22:34:26.843 I/AnkiDroid(19831): NoteEditor:: onBackPressed()
01-07 22:34:26.845 I/AnkiDroid(19831): finishWithAnimation DEFAULT
01-07 22:34:26.867 I/AnkiDroid(19831): SingleFragmentActivity::onPause
01-07 22:34:26.868 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onPause
01-07 22:34:26.876 I/AnkiDroid(19831): CardBrowser::onStart
01-07 22:34:26.881 I/AnkiDroid(19831): CardBrowser::onResume
01-07 22:34:27.000 I/AnkiDroid(19831): SingleFragmentActivity::onStop
01-07 22:34:27.000 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStop
01-07 22:34:27.003 I/AnkiDroid(19831): SingleFragmentActivity::onDestroy
01-07 22:34:27.004 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onViewDestroyed
01-07 22:34:27.004 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onDestroy
01-07 22:34:27.005 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onDetach
01-07 22:34:32.450 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully
01-07 22:34:35.672 I/AnkiDroid(19831): CardBrowser::onPause
01-07 22:34:35.689 I/AnkiDroid(19831): Setting theme to BLACK
01-07 22:34:35.692 I/AnkiDroid(19831): SingleFragmentActivity::onCreate
01-07 22:34:35.694 I/AnkiDroid(19831): isLegacyStorage(): current dir: /storage/emulated/0/Android/data/com.ichi2.anki/files/AnkiDroid
01-07 22:34:35.694 I/AnkiDroid(19831): scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki/files
01-07 22:34:35.694 I/AnkiDroid(19831): scoped internal dir: /data/user/0/com.ichi2.anki/files
01-07 22:34:35.694 I/AnkiDroid(19831): isLegacyStorage(): false
01-07 22:34:35.697 I/AnkiDroid(19831): SingleFragmentActivity::onStart
01-07 22:34:35.697 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onAttach
01-07 22:34:35.697 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onCreate
01-07 22:34:35.725 I/AnkiDroid(19831): onCollectionLoaded() Edit note activity successfully started with card id 1735326110966
01-07 22:34:35.728 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onViewCreated
01-07 22:34:35.728 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStart
01-07 22:34:35.730 I/AnkiDroid(19831): SingleFragmentActivity::onResume
01-07 22:34:35.731 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onResume
01-07 22:34:35.807 I/AnkiDroid(19831): CardBrowser::onStop
01-07 22:34:35.809 I/AnkiDroid(19831): CardBrowser::onSaveInstanceState
01-07 22:34:39.251 I/AnkiDroid(19831): NoteEditor:: Preview button pressed
01-07 22:34:39.270 I/AnkiDroid(19831): SingleFragmentActivity::onPause
01-07 22:34:39.270 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onPause
01-07 22:34:39.287 I/AnkiDroid(19831): Setting theme to BLACK
01-07 22:34:39.290 I/AnkiDroid(19831): CardViewerActivity::onCreate
01-07 22:34:39.291 I/AnkiDroid(19831): isLegacyStorage(): current dir: /storage/emulated/0/Android/data/com.ichi2.anki/files/AnkiDroid
01-07 22:34:39.291 I/AnkiDroid(19831): scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki/files
01-07 22:34:39.291 I/AnkiDroid(19831): scoped internal dir: /data/user/0/com.ichi2.anki/files
01-07 22:34:39.291 I/AnkiDroid(19831): isLegacyStorage(): false
01-07 22:34:39.293 I/AnkiDroid(19831): CardViewerActivity::onStart
01-07 22:34:39.293 I/AnkiDroid(19831): CardViewerActivity::k0::onAttach
01-07 22:34:39.293 I/AnkiDroid(19831): CardViewerActivity::k0::onCreate
01-07 22:34:39.296 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onAttach
01-07 22:34:39.296 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onCreate
01-07 22:34:39.326 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onViewCreated
01-07 22:34:39.327 I/AnkiDroid(19831): CardViewerActivity::k0::onViewCreated
01-07 22:34:39.328 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onStart
01-07 22:34:39.328 I/AnkiDroid(19831): CardViewerActivity::k0::onStart
01-07 22:34:39.333 I/AnkiDroid(19831): CardViewerActivity::onResume
01-07 22:34:39.334 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onResume
01-07 22:34:39.334 I/AnkiDroid(19831): CardViewerActivity::k0::onResume
01-07 22:34:39.439 I/AnkiDroid(19831): SingleFragmentActivity::onStop
01-07 22:34:39.439 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStop
01-07 22:34:39.442 I/AnkiDroid(19831): SingleFragmentActivity::onSaveInstanceState
01-07 22:34:39.442 I/AnkiDroid(19831): Saving instance
01-07 22:34:39.442 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onSaveInstanceState
01-07 22:34:39.662 I/AnkiDroid(19831): loading sounds for card 0
01-07 22:34:39.664 I/AnkiDroid(19831): playing sounds for QUESTION
01-07 22:34:40.469 I/AnkiDroid(19831): loading sounds for card 0
01-07 22:34:40.470 I/AnkiDroid(19831): playing sounds for ANSWER
01-07 22:34:41.442 I/AnkiDroid(19831): finishWithAnimation DEFAULT
01-07 22:34:41.460 I/AnkiDroid(19831): CardViewerActivity::onPause
01-07 22:34:41.460 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onPause
01-07 22:34:41.461 I/AnkiDroid(19831): CardViewerActivity::k0::onPause
01-07 22:34:41.468 I/AnkiDroid(19831): SingleFragmentActivity::onStart
01-07 22:34:41.468 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStart
01-07 22:34:41.473 I/AnkiDroid(19831): SingleFragmentActivity::onResume
01-07 22:34:41.473 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onResume
01-07 22:34:41.546 I/AnkiDroid(19831): CardViewerActivity::onStop
01-07 22:34:41.547 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onStop
01-07 22:34:41.547 I/AnkiDroid(19831): CardViewerActivity::k0::onStop
01-07 22:34:41.549 I/AnkiDroid(19831): CardViewerActivity::onDestroy
01-07 22:34:41.551 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onViewDestroyed
01-07 22:34:41.551 I/AnkiDroid(19831): CardViewerActivity::k0::onViewDestroyed
01-07 22:34:41.554 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onDestroy
01-07 22:34:41.555 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onDetach
01-07 22:34:41.555 I/AnkiDroid(19831): CardViewerActivity::k0::onDestroy
01-07 22:34:41.555 I/AnkiDroid(19831): CardViewerActivity::k0::onDetach
01-07 22:34:41.616 I/AnkiDroid(19831): NoteEditor:: onBackPressed()
01-07 22:34:41.618 I/AnkiDroid(19831): finishWithAnimation DEFAULT
01-07 22:34:41.629 I/AnkiDroid(19831): SingleFragmentActivity::onPause
01-07 22:34:41.630 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onPause
01-07 22:34:41.646 I/AnkiDroid(19831): CardBrowser::onStart
01-07 22:34:41.653 I/AnkiDroid(19831): CardBrowser::onResume
01-07 22:34:41.736 I/AnkiDroid(19831): SingleFragmentActivity::onStop
01-07 22:34:41.736 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStop
01-07 22:34:41.740 I/AnkiDroid(19831): SingleFragmentActivity::onDestroy
01-07 22:34:41.741 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onViewDestroyed
01-07 22:34:41.741 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onDestroy
01-07 22:34:41.741 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onDetach
01-07 22:34:46.320 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully
01-07 22:34:48.298 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully
01-07 22:34:52.988 I/AnkiDroid(19831): Back key pressed
01-07 22:34:52.988 I/AnkiDroid(19831): finishWithAnimation DEFAULT
01-07 22:34:53.013 I/AnkiDroid(19831): CardBrowser::onPause
01-07 22:34:53.026 I/AnkiDroid(19831): DeckPicker::onStart
01-07 22:34:53.030 I/AnkiDroid(19831): DeckPicker::onResume
01-07 22:34:53.121 I/AnkiDroid(19831): CardBrowser::onStop
01-07 22:34:53.124 I/AnkiDroid(19831): CardBrowser::onDestroy
01-07 22:34:53.172 I/AnkiDroid(19831): Updating deck list UI
01-07 22:34:53.175 I/AnkiDroid(19831): deck filter: 4 ()
01-07 22:34:54.814 I/AnkiDroid(19831): Pull to Sync: Syncing
01-07 22:34:54.816 I/AnkiDroid(19831): Sync: Normal collection sync
01-07 22:34:55.417 I/AnkiDroid(19831): Displaying progress dialog: 600ms elapsed;
01-07 22:34:55.417 I/AnkiDroid(19831): cancellable: true;
01-07 22:34:55.417 I/AnkiDroid(19831): manualCancel: true
01-07 22:34:55.417 I/AnkiDroid(19831):
01-07 22:34:56.862 I/AnkiDroid(19831): sync result: NO_CHANGES
01-07 22:34:56.873 I/AnkiDroid(19831): Launching background media sync
01-07 22:34:56.937 I/AnkiDroid(19831): DeckPicker: Showing media sync progress indicator
01-07 22:34:56.955 I/AnkiDroid(19831): Updating deck list UI
01-07 22:34:56.958 I/AnkiDroid(19831): refreshing: study queues updated
01-07 22:34:56.964 I/AnkiDroid(19831): deck filter: 4 ()
01-07 22:34:56.986 I/AnkiDroid(19831): DeckPicker: Showing media sync progress indicator
01-07 22:34:57.045 I/AnkiDroid(19831): Updating deck list UI
01-07 22:34:57.048 I/AnkiDroid(19831): deck filter: 4 ()
01-07 22:34:57.982 I/AnkiDroid(19831): DeckPicker: Hiding media sync progress indicator
01-07 22:36:54.658 I/AnkiDroid(19831): DeckPicker::onPause
01-07 22:36:54.695 I/AnkiDroid(19831): DeckPicker::onStop
01-07 22:36:54.699 I/AnkiDroid(19831): DeckPicker::onSaveInstanceState
01-07 22:38:47.314 I/AnkiDroid(19831): DeckPicker::onStart
01-07 22:38:47.322 I/AnkiDroid(19831): DeckPicker::onResume
01-07 22:38:47.439 I/AnkiDroid(19831): Updating deck list UI
01-07 22:38:47.443 I/AnkiDroid(19831): deck filter: 4 ()
01-07 22:38:48.269 I/AnkiDroid(19831): DeckPicker:: Selected deck with id 1646049683064
01-07 22:38:48.281 I/AnkiDroid(19831): DeckPicker::onPause
01-07 22:38:48.307 I/AnkiDroid(19831): Setting theme to BLACK
01-07 22:38:48.309 I/AnkiDroid(19831): Reviewer::onCreate
01-07 22:38:48.330 I/AnkiDroid(19831): isLegacyStorage(): current dir: /storage/emulated/0/Android/data/com.ichi2.anki/files/AnkiDroid
01-07 22:38:48.330 I/AnkiDroid(19831): scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki/files
01-07 22:38:48.330 I/AnkiDroid(19831): scoped internal dir: /data/user/0/com.ichi2.anki/files
01-07 22:38:48.330 I/AnkiDroid(19831): isLegacyStorage(): false
01-07 22:38:48.333 I/AnkiDroid(19831): isLegacyStorage(): current dir: /storage/emulated/0/Android/data/com.ichi2.anki/files/AnkiDroid
01-07 22:38:48.333 I/AnkiDroid(19831): scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki/files
01-07 22:38:48.333 I/AnkiDroid(19831): scoped internal dir: /data/user/0/com.ichi2.anki/files
01-07 22:38:48.333 I/AnkiDroid(19831): isLegacyStorage(): false
01-07 22:38:48.337 I/AnkiDroid(19831): ViewGroupUtils::setRenderWorkaround - using default / hardware rendering
01-07 22:38:48.337 I/AnkiDroid(19831): Reviewer::onStart
01-07 22:38:48.339 I/AnkiDroid(19831): Reviewer::onResume
01-07 22:38:48.450 I/AnkiDroid(19831): DeckPicker::onStop
01-07 22:38:48.451 I/AnkiDroid(19831): DeckPicker::onSaveInstanceState
01-07 22:38:48.457 I/AnkiDroid(19831): ViewGroupUtils::setRenderWorkaround - using default / hardware rendering
01-07 22:38:48.459 I/AnkiDroid(19831): loading sounds for card 1734180012472
01-07 22:38:48.464 I/AnkiDroid(19831): AbstractFlashcardViewer:: Question successfully shown for card id 1734180012472
01-07 22:38:48.467 I/AnkiDroid(19831): playing sounds for QUESTION
01-07 22:38:54.456 I/AnkiDroid(19831): AbstractFlashcardViewer:: Show answer button pressed
01-07 22:38:54.456 I/AnkiDroid(19831): stop: automatically show answer
01-07 22:38:54.458 I/AnkiDroid(19831): loading sounds for card 1734180012472
01-07 22:38:54.464 I/AnkiDroid(19831): playing sounds for ANSWER
01-07 22:39:32.050 I/AnkiDroid(19831): stop: automatically show question
01-07 22:39:32.050 I/AnkiDroid(19831): AbstractFlashcardViewer:: Ease_1 pressed
01-07 22:39:32.069 I/AnkiDroid(19831): refreshing: study queues updated
01-07 22:39:32.085 I/AnkiDroid(19831): ViewGroupUtils::setRenderWorkaround - using default / hardware rendering
01-07 22:39:32.086 I/AnkiDroid(19831): loading sounds for card 1734109917898
01-07 22:39:32.087 I/AnkiDroid(19831): playing sounds for QUESTION
01-07 22:39:32.088 I/AnkiDroid(19831): AbstractFlashcardViewer:: Question successfully shown for card id 1734109917898
01-07 22:39:32.564 I/AnkiDroid(19831): Back key pressed
01-07 22:39:32.564 I/AnkiDroid(19831): stop: automatically show answer
01-07 22:39:32.564 I/AnkiDroid(19831): stop: automatically show question
01-07 22:39:32.564 I/AnkiDroid(19831): finishWithAnimation DEFAULT
01-07 22:39:32.584 I/AnkiDroid(19831): Reviewer::onPause
01-07 22:39:32.584 I/AnkiDroid(19831): stop: automatically show answer
01-07 22:39:32.584 I/AnkiDroid(19831): stop: automatically show question
01-07 22:39:32.596 I/AnkiDroid(19831): DeckPicker::onStart
01-07 22:39:32.602 I/AnkiDroid(19831): DeckPicker::onResume
01-07 22:39:32.684 I/AnkiDroid(19831): Reviewer::onStop
01-07 22:39:32.690 I/AnkiDroid(19831): Reviewer::onDestroy
01-07 22:39:32.709 I/AnkiDroid(19831): Updating deck list UI
01-07 22:39:32.715 I/AnkiDroid(19831): deck filter: 4 ()
01-07 22:39:34.553 I/AnkiDroid(19831): Navigating to card browser
01-07 22:39:34.572 I/AnkiDroid(19831): DeckPicker::onPause
01-07 22:39:34.586 I/AnkiDroid(19831): Setting theme to BLACK
01-07 22:39:34.599 I/AnkiDroid(19831): CardBrowser::onCreate
01-07 22:39:34.601 I/AnkiDroid(19831): isLegacyStorage(): current dir: /storage/emulated/0/Android/data/com.ichi2.anki/files/AnkiDroid
01-07 22:39:34.601 I/AnkiDroid(19831): scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki/files
01-07 22:39:34.601 I/AnkiDroid(19831): scoped internal dir: /data/user/0/com.ichi2.anki/files
01-07 22:39:34.602 I/AnkiDroid(19831): isLegacyStorage(): false
01-07 22:39:34.613 I/AnkiDroid(19831): isLegacyStorage(): current dir: /storage/emulated/0/Android/data/com.ichi2.anki/files/AnkiDroid
01-07 22:39:34.613 I/AnkiDroid(19831): scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki/files
01-07 22:39:34.613 I/AnkiDroid(19831): scoped internal dir: /data/user/0/com.ichi2.anki/files
01-07 22:39:34.613 I/AnkiDroid(19831): isLegacyStorage(): false
01-07 22:39:34.626 I/AnkiDroid(19831): CardBrowser::onStart
01-07 22:39:34.628 I/AnkiDroid(19831): CardBrowser::onResume
01-07 22:39:34.634 I/AnkiDroid(19831): setting deck: 1646049683064
01-07 22:39:34.691 I/AnkiDroid(19831): initCompleted
01-07 22:39:34.710 I/AnkiDroid(19831): DeckPicker::onStop
01-07 22:39:34.711 I/AnkiDroid(19831): DeckPicker::onSaveInstanceState
01-07 22:39:35.085 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully
01-07 22:39:35.524 I/AnkiDroid(19831): CardBrowser::onPause
01-07 22:39:35.539 I/AnkiDroid(19831): Setting theme to BLACK
01-07 22:39:35.542 I/AnkiDroid(19831): SingleFragmentActivity::onCreate
01-07 22:39:35.543 I/AnkiDroid(19831): isLegacyStorage(): current dir: /storage/emulated/0/Android/data/com.ichi2.anki/files/AnkiDroid
01-07 22:39:35.543 I/AnkiDroid(19831): scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki/files
01-07 22:39:35.543 I/AnkiDroid(19831): scoped internal dir: /data/user/0/com.ichi2.anki/files
01-07 22:39:35.543 I/AnkiDroid(19831): isLegacyStorage(): false
01-07 22:39:35.546 I/AnkiDroid(19831): SingleFragmentActivity::onStart
01-07 22:39:35.546 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onAttach
01-07 22:39:35.546 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onCreate
01-07 22:39:35.683 I/AnkiDroid(19831): onCollectionLoaded() Edit note activity successfully started with card id 1734180012472
01-07 22:39:35.687 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onViewCreated
01-07 22:39:35.688 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStart
01-07 22:39:35.692 I/AnkiDroid(19831): SingleFragmentActivity::onResume
01-07 22:39:35.693 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onResume
01-07 22:39:35.790 I/AnkiDroid(19831): CardBrowser::onStop
01-07 22:39:35.792 I/AnkiDroid(19831): CardBrowser::onSaveInstanceState
01-07 22:39:45.034 I/AnkiDroid(19831): NoteEditor:: Save note button pressed
01-07 22:39:45.061 I/AnkiDroid(19831): finishWithAnimation DEFAULT
01-07 22:39:45.440 W/AnkiDroid(19831): h3/ blocked main thread for 350ms:
01-07 22:39:45.440 W/AnkiDroid(19831): M3.h3.j(SourceFile:61)
01-07 22:39:45.448 I/AnkiDroid(19831): SingleFragmentActivity::onPause
01-07 22:39:45.448 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onPause
01-07 22:39:45.457 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully
01-07 22:39:45.460 I/AnkiDroid(19831): CardBrowser::onStart
01-07 22:39:45.468 I/AnkiDroid(19831): CardBrowser:: CardBrowser: Saving card...
01-07 22:39:45.470 I/AnkiDroid(19831): CardBrowser::onResume
01-07 22:39:45.593 I/AnkiDroid(19831): SingleFragmentActivity::onStop
01-07 22:39:45.593 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStop
01-07 22:39:45.595 I/AnkiDroid(19831): SingleFragmentActivity::onDestroy
01-07 22:39:45.596 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onViewDestroyed
01-07 22:39:45.596 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onDestroy
01-07 22:39:45.596 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onDetach
01-07 22:39:45.968 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully
01-07 22:39:46.434 I/AnkiDroid(19831): CardBrowser::onPause
01-07 22:39:46.446 I/AnkiDroid(19831): Setting theme to BLACK
01-07 22:39:46.450 I/AnkiDroid(19831): SingleFragmentActivity::onCreate
01-07 22:39:46.452 I/AnkiDroid(19831): isLegacyStorage(): current dir: /storage/emulated/0/Android/data/com.ichi2.anki/files/AnkiDroid
01-07 22:39:46.452 I/AnkiDroid(19831): scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki/files
01-07 22:39:46.452 I/AnkiDroid(19831): scoped internal dir: /data/user/0/com.ichi2.anki/files
01-07 22:39:46.452 I/AnkiDroid(19831): isLegacyStorage(): false
01-07 22:39:46.455 I/AnkiDroid(19831): SingleFragmentActivity::onStart
01-07 22:39:46.455 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onAttach
01-07 22:39:46.455 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onCreate
01-07 22:39:46.488 I/AnkiDroid(19831): onCollectionLoaded() Edit note activity successfully started with card id 1734180012472
01-07 22:39:46.491 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onViewCreated
01-07 22:39:46.491 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStart
01-07 22:39:46.493 I/AnkiDroid(19831): SingleFragmentActivity::onResume
01-07 22:39:46.494 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onResume
01-07 22:39:46.582 I/AnkiDroid(19831): CardBrowser::onStop
01-07 22:39:46.583 I/AnkiDroid(19831): CardBrowser::onSaveInstanceState
01-07 22:39:46.988 I/AnkiDroid(19831): NoteEditor:: Preview button pressed
01-07 22:39:47.008 I/AnkiDroid(19831): SingleFragmentActivity::onPause
01-07 22:39:47.008 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onPause
01-07 22:39:47.025 I/AnkiDroid(19831): Setting theme to BLACK
01-07 22:39:47.027 I/AnkiDroid(19831): CardViewerActivity::onCreate
01-07 22:39:47.029 I/AnkiDroid(19831): isLegacyStorage(): current dir: /storage/emulated/0/Android/data/com.ichi2.anki/files/AnkiDroid
01-07 22:39:47.029 I/AnkiDroid(19831): scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki/files
01-07 22:39:47.029 I/AnkiDroid(19831): scoped internal dir: /data/user/0/com.ichi2.anki/files
01-07 22:39:47.029 I/AnkiDroid(19831): isLegacyStorage(): false
01-07 22:39:47.031 I/AnkiDroid(19831): CardViewerActivity::onStart
01-07 22:39:47.031 I/AnkiDroid(19831): CardViewerActivity::k0::onAttach
01-07 22:39:47.031 I/AnkiDroid(19831): CardViewerActivity::k0::onCreate
01-07 22:39:47.035 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onAttach
01-07 22:39:47.035 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onCreate
01-07 22:39:47.064 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onViewCreated
01-07 22:39:47.064 I/AnkiDroid(19831): CardViewerActivity::k0::onViewCreated
01-07 22:39:47.065 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onStart
01-07 22:39:47.065 I/AnkiDroid(19831): CardViewerActivity::k0::onStart
01-07 22:39:47.068 I/AnkiDroid(19831): CardViewerActivity::onResume
01-07 22:39:47.069 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onResume
01-07 22:39:47.069 I/AnkiDroid(19831): CardViewerActivity::k0::onResume
01-07 22:39:47.175 I/AnkiDroid(19831): SingleFragmentActivity::onStop
01-07 22:39:47.175 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStop
01-07 22:39:47.178 I/AnkiDroid(19831): SingleFragmentActivity::onSaveInstanceState
01-07 22:39:47.178 I/AnkiDroid(19831): Saving instance
01-07 22:39:47.178 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onSaveInstanceState
01-07 22:39:47.275 I/AnkiDroid(19831): loading sounds for card 0
01-07 22:39:47.278 I/AnkiDroid(19831): playing sounds for QUESTION
01-07 22:39:47.692 I/AnkiDroid(19831): loading sounds for card 0
01-07 22:39:47.693 I/AnkiDroid(19831): playing sounds for ANSWER
01-07 22:39:49.927 I/AnkiDroid(19831): finishWithAnimation DEFAULT
01-07 22:39:49.945 I/AnkiDroid(19831): CardViewerActivity::onPause
01-07 22:39:49.945 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onPause
01-07 22:39:49.945 I/AnkiDroid(19831): CardViewerActivity::k0::onPause
01-07 22:39:49.958 I/AnkiDroid(19831): SingleFragmentActivity::onStart
01-07 22:39:49.958 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onStart
01-07 22:39:49.964 I/AnkiDroid(19831): SingleFragmentActivity::onResume
01-07 22:39:49.964 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onResume
01-07 22:39:50.030 I/AnkiDroid(19831): CardViewerActivity::onStop
01-07 22:39:50.031 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onStop
01-07 22:39:50.032 I/AnkiDroid(19831): CardViewerActivity::k0::onStop
01-07 22:39:50.038 I/AnkiDroid(19831): CardViewerActivity::onDestroy
01-07 22:39:50.041 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onViewDestroyed
01-07 22:39:50.041 I/AnkiDroid(19831): CardViewerActivity::k0::onViewDestroyed
01-07 22:39:50.045 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onDestroy
01-07 22:39:50.046 I/AnkiDroid(19831): CardViewerActivity::TemplatePreviewerFragment::onDetach
01-07 22:39:50.046 I/AnkiDroid(19831): CardViewerActivity::k0::onDestroy
01-07 22:39:50.046 I/AnkiDroid(19831): CardViewerActivity::k0::onDetach
01-07 22:39:54.081 I/AnkiDroid(19831): NoteEditor:: Save note button pressed
01-07 22:39:54.100 I/AnkiDroid(19831): finishWithAnimation DEFAULT
01-07 22:39:54.469 W/AnkiDroid(19831): h3/ blocked main thread for 347ms:
01-07 22:39:54.469 W/AnkiDroid(19831): M3.h3.j(SourceFile:61)
01-07 22:39:54.478 I/AnkiDroid(19831): SingleFragmentActivity::onPause
01-07 22:39:54.478 I/AnkiDroid(19831): SingleFragmentActivity::Y6::onPause
01-07 22:39:54.492 I/AnkiDroid(19831): CardBrowser::onStart
01-07 22:39:54.495 I/AnkiDroid(19831): CardBrowser:: CardBrowser: Saving card...
01-07 22:39:54.497 I/AnkiDroid(19831): CardBrowser::onResume
Here are the phone hardware details. Android 13, motorola, reasonably up to date
ANDROID_VERSION
13
APP_VERSION_CODE
322100105
APP_VERSION_NAME
2.21alpha5
AVAILABLE_MEM_SIZE
63420755968
BRAND
motorola
BUILD
BOARD
rhodei
BOOTLOADER
MBM-3.0-uefi-a81d8fab74f-241104
BRAND
motorola
CPU_ABI
arm64-v8a
CPU_ABI2
DEVICE
rhodei
DISPLAY
T1SSIS33.1-75-7-11
FINGERPRINT
motorola/rhodei_g/rhodei:13/T1SSIS33.1-75-7-11/ae511-e97884:user/release-keys
HARDWARE
qcom
HOST
ilclbld185
ID
T1SSIS33.1-75-7-11
IS_DEBUGGABLE
false
IS_EMULATOR
false
MANUFACTURER
motorola
MODEL
moto g62 5G
ODM_SKU
d
PERMISSIONS_REVIEW_REQUIRED
true
PRODUCT
rhodei_g
RADIO
unknown
SKU
XT2223-3
SOC_MANUFACTURER
QTI
SOC_MODEL
SM6375
SUPPORTED_32_BIT_ABIS
0
armeabi-v7a
1
armeabi
SUPPORTED_64_BIT_ABIS
0
arm64-v8a
SUPPORTED_ABIS
0
arm64-v8a
1
armeabi-v7a
2
armeabi
TAGS
release-keys
TIME
1730728573000
TYPE
user
UNKNOWN
unknown
USER
hudsoncm
VERSION
ACTIVE_CODENAMES
BASE_OS
motorola/rhodei_g/rhodei:13/T1SSI33.1-75-7/a358f-acad3f:user/release-keys
CODENAME
REL
INCREMENTAL
ae511-e97884
KNOWN_CODENAMES
{HoneycombMr1, HoneycombMr2, Lollipop, Kitkat, Tiramisu, Gingerbread, Cupcake, IceCreamSandwichMr1, JellyBean, IceCreamSandwich, LollipopMr1, M, N, O, P, Q, R, S, Sv2, Base, NMr1, OMr1, JellyBeanMr1, JellyBeanMr2, Donut, Froyo, GingerbreadMr1, EclairMr1, Honeycomb, Eclair01, KitkatWatch, Base11, Eclair}
MEDIA_PERFORMANCE_CLASS
0
PREVIEW_SDK_FINGERPRINT
REL
PREVIEW_SDK_INT
0
RELEASE
13
RELEASE_OR_CODENAME
13
RELEASE_OR_PREVIEW_DISPLAY
13
SDK
33
SDK_INT
33
SECURITY_PATCH
2024-11-01
Expected behaviour
no crash
Debug info
put everything I could up above - this is 2.21alpha5 though, release mode, most current we have
(Optional) Anything else you want to share?
No response
Research
- [x] I have checked the manual and the FAQ and could not find a solution to my issue
- [x] (Optional) I have confirmed the issue is not resolved in the latest alpha release (instructions)
@mikehardy are you the affected user?
@david-allison nope turns out it was @user1823 they apparently created a new note and when the app saved and went back to the card browser this report was sent.
Perhaps after note creation you need to update the data set as changed ?
they apparently created a new note
Not created a note, but edited it.
I don't remember the exact sequence of events. My fingers were moving fast and I might have performed some other minor actions after saving the note such as swiping up/down, pressing the hamburger menu on top left, etc.
I spent some time on the issue ,as following the stack trace we can see that is error is thrown at 6821 line number in RecyclerView which checks is offsetPosition is < 0 or offsetPosition >= number of intems in the concerned adapter , now there are two possiblities that maybe there is addition of items in the dataset without notifying the linked adapter about it , or there is something wrong with the offsetPosition , my suspicion strongly inclines toward the inconsistent data
i have understood how to fix the issue please assign me this issue ?
The maintainers here often don't assign issue to people. You just need to mention in the issue that you are working on it & then create a PR.
@Scapesfear you say you understand the issue, but did you consistently reproduce the issue? Reproduction is much more useful than guessing via code inspection
@mikehardy i couldn't reproduce the error ,as user did not provided any reproducing steps and i couldn't figure out that , but investigation with the help of log cat and stack trace i think
if (result.resultCode != RESULT_CANCELED) { Timber.i("CardBrowser:: CardBrowser: Saving card...") saveEditedCard() }
this is where the data inconsistency is happening as in the logcat statements there are 01-07 22:34:11.565 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully 01-07 22:34:19.962 I/AnkiDroid(19831): CardBrowser::onPause 01-07 22:34:20.107 I/AnkiDroid(19831): CardBrowser::onStop 01-07 22:34:20.108 I/AnkiDroid(19831): CardBrowser::onSaveInstanceState 01-07 22:34:26.876 I/AnkiDroid(19831): CardBrowser::onStart 01-07 22:34:26.881 I/AnkiDroid(19831): CardBrowser::onResume 01-07 22:34:32.450 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully 01-07 22:34:35.672 I/AnkiDroid(19831): CardBrowser::onPause 01-07 22:34:35.807 I/AnkiDroid(19831): CardBrowser::onStop 01-07 22:34:35.809 I/AnkiDroid(19831): CardBrowser::onSaveInstanceState 01-07 22:34:41.646 I/AnkiDroid(19831): CardBrowser::onStart 01-07 22:34:41.653 I/AnkiDroid(19831): CardBrowser::onResume 01-07 22:34:46.320 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully 01-07 22:34:48.298 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully 01-07 22:34:53.013 I/AnkiDroid(19831): CardBrowser::onPause 01-07 22:34:53.121 I/AnkiDroid(19831): CardBrowser::onStop 01-07 22:34:53.124 I/AnkiDroid(19831): CardBrowser::onDestroy 01-07 22:39:34.599 I/AnkiDroid(19831): CardBrowser::onCreate 01-07 22:39:34.626 I/AnkiDroid(19831): CardBrowser::onStart 01-07 22:39:34.628 I/AnkiDroid(19831): CardBrowser::onResume 01-07 22:39:35.085 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully 01-07 22:39:35.524 I/AnkiDroid(19831): CardBrowser::onPause 01-07 22:39:35.790 I/AnkiDroid(19831): CardBrowser::onStop 01-07 22:39:35.792 I/AnkiDroid(19831): CardBrowser::onSaveInstanceState 01-07 22:39:45.457 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully 01-07 22:39:45.460 I/AnkiDroid(19831): CardBrowser::onStart 01-07 22:39:45.468 I/AnkiDroid(19831): CardBrowser:: CardBrowser: Saving card... 01-07 22:39:45.470 I/AnkiDroid(19831): CardBrowser::onResume 01-07 22:39:45.968 I/AnkiDroid(19831): CardBrowser:: Completed searchCards() Successfully 01-07 22:39:46.434 I/AnkiDroid(19831): CardBrowser::onPause 01-07 22:39:46.582 I/AnkiDroid(19831): CardBrowser::onStop 01-07 22:39:46.583 I/AnkiDroid(19831): CardBrowser::onSaveInstanceState 01-07 22:39:54.492 I/AnkiDroid(19831): CardBrowser::onStart 01-07 22:39:54.495 I/AnkiDroid(19831): CardBrowser:: CardBrowser: Saving card... 01-07 22:39:54.497 I/AnkiDroid(19831): CardBrowser::onResume
i can't decode the exact steps to reproduce , but this is the footsteps of user related to CardBrowser
The user was in card browser and edited a card by tapping on it They saved the card and got the error
Those were the steps provided by the user, and we have the logcat.
You infer from inspection of RecyclerView that:
offsetPosition is < 0 or offsetPosition >= number of items in the concerned adapter
What happens with different boundary conditions related to number of items in adapter and position of adapter? That is, what happens if there is only 1 item in the browser, or the browser has enough items it is scrollable when you try to reproduce? What happens in combination with item count if the item you are editing is at the top of the adapter or the bottom of the adapter?
What did you try ?
(the subtext I am implying quite strongly is that when you are dealing with a crash bug, you should have no confidence that you fixed it unless you reproduced it first. I have no confidence in it anyway)
I tried doing the reproducing steps that user did on my device with the 2.21alpha5 and also on 2.20 release but it was working as expected , there is no error showing for me
AnkiDroid Version = 2.21alpha5-debug (e35b5b996e7f548ad6f10f871784b2174c521fbc)
Backend Version = 0.1.48-anki24.11 (24.11 c47638ca36f99dd4f3b81ae82d964aec66e392e0)
Android Version = 14 (SDK 34)
ProductFlavor = amazon
Device Info = samsung | samsung | m23xq | m23xqdd | SM-E236B | qcom
Webview User Agent = Mozilla/5.0 (Linux; Android 14; SM-E236B Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.135 Mobile Safari/537.36
ACRA UUID = 3f8d2487-632f-40e1-a632-80d4dbed519c
FSRS = 1.4.3 (Enabled: false)
Crash Reports Enabled = false
@Scapesfear I gave specific scenarios about various boundary things you could try. I then asked a specific question: what did you try? Your answer is vague. What exactly did you try, lists of steps, specific conditions etc.
i tried Opening the card browser Making a change to a card and saving it as you said user did, i haven't checked the boundary things.
i haven't checked the boundary things.
I'm a bit disappointed at that after spending time emphasizing how important reproduction was and giving you suggestions.
What happens with different boundary conditions related to number of items in adapter and position of adapter? That is, what happens if there is only 1 item in the browser, or the browser has enough items it is scrollable when you try to reproduce? What happens in combination with item count if the item you are editing is at the top of the adapter or the bottom of the adapter?
Earlier, I wasn't able to fully grasp what you were asking regarding the boundary conditions related to the number of items in the adapter and the position of the items. However, after working on a different issue, I now understand the scenario you're describing. You're referring to cases such as when there is only one item in the browser, or when there are enough items to make the browser scrollable. Additionally, you're highlighting what happens when the item being edited is at the top or bottom of the adapter.
Sorry to disappoint you earlier.
I will do all the test for the conditions and tell you what are the results
Results : Case - 1 item in whole browser Result- Worked fine
Case-2 enough scrollable items (71 cards ) in browser top card edit Result-Worked fine
Case-3 enough scrollable items (71 cards ) in browser last card edit Result-Worked fine
Logcat
0:22:51.804 ViewRootIm...rdBrowser] I ViewPostIme pointer 0
10:22:51.925 ViewRootIm...rdBrowser] I ViewPostIme pointer 1
10:22:52.341 ViewRootIm...rdBrowser] I ViewPostIme pointer 0
10:22:52.446 ViewRootIm...rdBrowser] I ViewPostIme pointer 1
10:22:52.882 ViewRootIm...rdBrowser] I ViewPostIme pointer 0
10:22:52.974 ViewRootIm...rdBrowser] I ViewPostIme pointer 1
10:22:53.127 audit E type=1400 audit(1737109373.122:212175): avc: granted { execute } for pid=7283 comm="chi2.anki.debug" path="/data/data/com.ichi2.anki.debug/code_cache/startup_agents/80b517d0-agent.so" dev="dm-52" ino=712906 scontext=u:r:untrusted_app:s0:c135,c257,c512,c768 tcontext=u:object_r:app_data_file:s0:c135,c257,c512,c768 tclass=file SEPF_SM-G991B_12_0001 audit_filtered
10:22:53.127 audit E type=1327 audit(1737109373.122:212175): proctitle="com.ichi2.anki.debug"
10:22:53.135 chi2.anki.debug W DexFile /data/data/com.ichi2.anki.debug/code_cache/.studio/instruments-885acadd.jar is in boot class path but is not in a known location
10:22:53.144 chi2.anki.debug W Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
10:22:53.148 chi2.anki.debug W Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
10:22:53.149 chi2.anki.debug W Redefining intrinsic method java.lang.Thread java.lang.Thread.currentThread(). This may cause the unexpected use of the original definition of java.lang.Thread java.lang.Thread.currentThread()in methods that have already been compiled.
10:22:53.149 chi2.anki.debug W Redefining intrinsic method boolean java.lang.Thread.interrupted(). This may cause the unexpected use of the original definition of boolean java.lang.Thread.interrupted()in methods that have already been compiled.
10:22:53.153 chi2.anki.debug W Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
10:22:53.157 chi2.anki.debug W Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
10:22:53.164 chi2.anki.debug W Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
10:22:53.305 ViewRootIm...rdBrowser] I ViewPostIme pointer 0
10:22:53.339 ActivityTaskManager E Removing snapshot from cache for com.ichi2.anki.debug [23471]
10:22:53.347 System W ClassLoader referenced unknown path:
10:22:53.347 nativeloader D Configuring clns-7 for other apk . target_sdk_version=34, uses_libraries=, library_path=/data/app/~~yyZCTaYnSu0x6TZPz2BDGA==/com.ichi2.anki.debug-fkteuyjA2bSQC6ysrnk-Ww==/lib/arm64:/data/app/~~yyZCTaYnSu0x6TZPz2BDGA==/com.ichi2.anki.debug-fkteuyjA2bSQC6ysrnk-Ww==/base.apk!/lib/arm64-v8a, permitted_path=/data:/mnt/expand:/data/user/0/com.ichi2.anki.debug
10:22:53.349 ActivityThread I handleApplicationInfoChanged: updating resDirs from appInfo to activityInfo for locale overlays
10:22:53.404 ViewRootIm...rdBrowser] I ViewPostIme pointer 1
10:22:53.422 AnkiDroidApp$onCreate I CardBrowser::onPause
10:22:53.423 ViewRootIm...rdBrowser] I stopped(true) old = false
10:22:53.423 ViewRootIm...rdBrowser] D WindowStopped on com.ichi2.anki.debug/com.ichi2.anki.CardBrowser set to true
10:22:53.425 AnkiDroidApp$onCreate I CardBrowser::onStop
10:22:53.427 WidgetStatus D WidgetStatus.update(): already running or not enabled
10:22:53.428 AnkiDroidApp$onCreate I CardBrowser::onSaveInstanceState
10:22:53.434 AnkiDroidApp$onCreate I CardBrowser::onDestroy
10:22:53.436 WindowOnBackDispatcher W sendCancelIfRunning: isInProgress=falsecallback=android.view.ViewRootImpl$$ExternalSyntheticLambda19@f23a8c9
10:22:53.441 ViewRootIm...rdBrowser] I dispatchDetachedFromWindow
10:22:53.459 Themes I Setting theme to BLACK
10:22:53.463 AnkiDroidApp$onCreate I CardBrowser::onCreate
10:22:53.468 ScopedStorageService I isLegacyStorage(): current dir: /storage/emulated/0/AnkiDroid
scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki.debug/files
scoped internal dir: /data/user/0/com.ichi2.anki.debug/files
10:22:53.469 ScopedStorageService I isLegacyStorage(): true
10:22:53.471 chi2.anki.debug E Invalid resource ID 0x00000000.
10:22:53.536 ScopedStorageService I isLegacyStorage(): current dir: /storage/emulated/0/AnkiDroid
scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki.debug/files
scoped internal dir: /data/user/0/com.ichi2.anki.debug/files
10:22:53.536 ScopedStorageService I isLegacyStorage(): true
10:22:53.541 AnkiActivity D AnkiActivity.startLoadingCollection()
10:22:53.543 AnkiActivity D Synchronously calling onCollectionLoaded
10:22:53.543 CardBrowser D onCollectionLoaded()
10:22:53.557 AnkiDroidApp$onCreate I CardBrowser::onStart
10:22:53.566 AnkiDroidApp$onCreate I CardBrowser::onResume
10:22:53.566 CardBrowse...chForCards D performing search: 'deck:"diving" '
10:22:53.566 UsageAnalytics D sendAnalyticsScreenView(): CardBrowser
10:22:53.567 UsageAnalytics D getOptIn() status: false
10:22:53.568 CardBrowser D query expansion changed: false
10:22:53.572 CardBrowser D end multiselect mode
10:22:53.577 CardBrowser D mode change: CARDS - updating spinner titles
10:22:53.579 CardBrowse...chForCards D Search returned 634 card(s)
10:22:53.594 CardBrowserViewModel D updating column 1 to SFLD
10:22:53.596 CardBrowserViewModel D updating column 2 to CARD
10:22:53.647 CardBrowser D search state: Searching
10:22:53.647 CardBrowse...chForCards D performing search: 'deck:"diving" '
10:22:53.649 CardBrowser D onCreateOptionsMenu()
10:22:53.660 CardBrowse...chForCards D Search returned 634 card(s)
10:22:53.668 CardBrowser D onSelectionChanged
10:22:53.668 CardBrowser D updateMultiselectMenu()
10:22:53.804 CardBrowserViewModel D updating column 1 to SFLD
10:22:53.804 CardBrowserViewModel D updating column 2 to CARD
10:22:53.804 CardBrowser D search state: Completed
10:22:53.805 CardBrowser I CardBrowser:: Completed searchCards() Successfully
10:22:53.806 CardBrowser D updateList
10:22:53.806 CardBrowser D onSelectionChanged
10:22:53.806 CardBrowser D updateMultiselectMenu()
10:22:58.845 BrowserMul...ViewHolder D Tapped: 1537448757393
10:22:58.881 AnkiDroidApp$onCreate I CardBrowser::onPause
10:22:58.904 Themes I Setting theme to BLACK
10:22:58.910 AnkiDroidApp$onCreate I SingleFragmentActivity::onCreate
10:22:58.915 ScopedStorageService I isLegacyStorage(): current dir: /storage/emulated/0/AnkiDroid
scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki.debug/files
scoped internal dir: /data/user/0/com.ichi2.anki.debug/files
10:22:58.916 ScopedStorageService I isLegacyStorage(): true
10:22:58.917 chi2.anki.debug E Invalid resource ID 0x00000000.
10:22:58.924 SingleFragmentActivity D Creating fragment com.ichi2.anki.NoteEditor
10:22:58.940 AnkiDroidApp$onCreate I SingleFragmentActivity::onStart
10:22:58.942 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onAttach
10:22:58.944 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onCreate
10:22:58.952 ScrollView D initGoToTop
10:22:58.986 NoteEditor D NoteEditor() onCollectionLoaded: caller: EDIT
10:22:59.140 NoteEditor D updateCards()
10:22:59.140 NoteEditor D updateCards() template count is 1
10:22:59.189 NoteEditor I onCollectionLoaded() Edit note activity successfully started with card id 1537448757393
10:22:59.200 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onViewCreated
10:22:59.204 WindowOnBackDispatcher W OnBackInvokedCallback is not enabled for the application.
Set 'android:enableOnBackInvokedCallback="true"' in the application manifest.
10:22:59.204 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onStart
10:22:59.207 AnkiDroidApp$onCreate I SingleFragmentActivity::onResume
10:22:59.207 UsageAnalytics D sendAnalyticsScreenView(): SingleFragmentActivity
10:22:59.207 UsageAnalytics D getOptIn() status: false
10:22:59.208 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onResume
10:22:59.294 ScrollView D onsize change changed
10:22:59.356 AssistStructure I Flattened final assist data: 5988 bytes, containing 1 windows, 41 views
10:22:59.584 AnkiDroidApp$onCreate I CardBrowser::onStop
10:22:59.585 WidgetStatus D WidgetStatus.update(): already running or not enabled
10:22:59.586 AnkiDroidApp$onCreate I CardBrowser::onSaveInstanceState
10:23:00.005 DayRolloverHandler V received android.intent.action.TIME_TICK
10:23:00.238 WindowOnBackDispatcher D onBackInvoked, owner=ViewRootImpl@3feb94e[SingleFragmentActivity], callback=android.view.ViewRootImpl$$ExternalSyntheticLambda19@643af80
10:23:00.249 Activity D onKeyDown(KEYCODE_BACK)
10:23:00.250 Activity D onKeyUp(KEYCODE_BACK) isTracking()=true isCanceled()=false hasCallback=false
10:23:00.251 NoteEditor I NoteEditor:: onBackPressed()
10:23:00.257 AnkiActivity I finishWithAnimation DEFAULT
10:23:00.262 AnkiDroidApp$onCreate I SingleFragmentActivity::onPause
10:23:00.263 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onPause
10:23:00.269 AnkiDroidApp$onCreate I CardBrowser::onStart
10:23:00.274 CardBrowser D onEditCardActivityResult: resultCode=0
10:23:00.274 AnkiDroidApp$onCreate I CardBrowser::onResume
10:23:00.275 UsageAnalytics D sendAnalyticsScreenView(): CardBrowser
10:23:00.275 UsageAnalytics D getOptIn() status: false
10:23:00.278 CardBrowser D query expansion changed: false
10:23:00.286 CardBrowse...chForCards D performing search: 'deck:"diving" '
10:23:00.290 CardBrowser D end multiselect mode
10:23:00.295 CardBrowse...chForCards D Search returned 634 card(s)
10:23:00.299 CardBrowser D mode change: CARDS - updating spinner titles
10:23:00.300 CardBrowser D onCreateOptionsMenu()
10:23:00.314 CardBrowser D onSelectionChanged
10:23:00.314 CardBrowser D updateMultiselectMenu()
10:23:00.322 CardBrowserViewModel D updating column 1 to SFLD
10:23:00.324 CardBrowserViewModel D updating column 2 to CARD
10:23:00.433 CardBrowse...chForCards D performing search: 'deck:"diving" '
10:23:00.438 CardBrowserViewModel D updating column 1 to SFLD
10:23:00.438 CardBrowserViewModel D updating column 2 to CARD
10:23:00.449 CardBrowse...chForCards D Search returned 634 card(s)
10:23:00.452 CardBrowser D search state: Completed
10:23:00.452 CardBrowser I CardBrowser:: Completed searchCards() Successfully
10:23:00.453 CardBrowser D updateList
10:23:00.453 CardBrowser D onSelectionChanged
10:23:00.453 CardBrowser D updateMultiselectMenu()
10:23:00.544 AnkiDroidApp$onCreate I SingleFragmentActivity::onStop
10:23:00.545 WidgetStatus D WidgetStatus.update(): already running or not enabled
10:23:00.545 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onStop
10:23:00.547 AnkiDroidApp$onCreate I SingleFragmentActivity::onDestroy
10:23:00.551 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onViewDestroyed
10:23:00.552 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onDestroy
10:23:00.552 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onDetach
10:23:00.553 WindowOnBackDispatcher W sendCancelIfRunning: isInProgress=falsecallback=android.view.ViewRootImpl$$ExternalSyntheticLambda19@643af80
10:23:04.900 BrowserMul...ViewHolder D Long press: 1537448757393
10:23:04.902 CardBrowserViewModel D toggled selecting id '1537448757393'; 1 selected
10:23:04.907 CardBrowse...edRowsFlow D refreshed selected rows
10:23:04.908 CardBrowser D onSelectionChanged
10:23:04.908 CardBrowser D updateMultiselectMenu()
10:23:04.910 CardBrowser D load multiselect mode
10:23:04.918 CardBrowser D onCreateOptionsMenu()
10:23:04.943 CardBrowser D onSelectionChanged
10:23:04.943 CardBrowser D updateMultiselectMenu()
10:23:09.481 BrowserMul...ViewHolder D Tapped: 1537448757393
10:23:09.483 CardBrowserViewModel D toggled selecting id '1537448757393'; 0 selected
10:23:09.487 CardBrowse...edRowsFlow D refreshed selected rows
10:23:09.487 CardBrowser D onSelectionChanged
10:23:09.487 CardBrowser D updateMultiselectMenu()
10:23:09.500 CardBrowser D end multiselect mode
10:23:09.503 CardBrowser D onCreateOptionsMenu()
10:23:09.518 CardBrowser D onSelectionChanged
10:23:09.518 CardBrowser D updateMultiselectMenu()
10:23:10.978 BrowserMul...ViewHolder D Long press: 1537461393493
10:23:10.979 CardBrowserViewModel D toggled selecting id '1537461393493'; 1 selected
10:23:10.983 CardBrowse...edRowsFlow D refreshed selected rows
10:23:10.984 CardBrowser D onSelectionChanged
10:23:10.984 CardBrowser D updateMultiselectMenu()
10:23:10.986 CardBrowser D load multiselect mode
10:23:10.999 CardBrowser D onCreateOptionsMenu()
10:23:11.016 CardBrowser D onSelectionChanged
10:23:11.016 CardBrowser D updateMultiselectMenu()
10:23:12.672 WindowOnBackDispatcher D onBackInvoked, owner=ViewRootImpl@3feb94e[SingleFragmentActivity], callback=android.view.ViewRootImpl$$ExternalSyntheticLambda19@bf00f21
10:23:12.675 Activity D onKeyDown(KEYCODE_BACK)
10:23:12.675 Activity D onKeyUp(KEYCODE_BACK) isTracking()=true isCanceled()=false hasCallback=false
10:23:12.676 CardBrowserViewModel D selecting none
10:23:12.679 CardBrowse...edRowsFlow D refreshed selected rows
10:23:12.680 CardBrowser D onSelectionChanged
10:23:12.680 CardBrowser D updateMultiselectMenu()
10:23:12.694 CardBrowser D end multiselect mode
10:23:12.696 CardBrowser D onCreateOptionsMenu()
10:23:12.712 CardBrowser D onSelectionChanged
10:23:12.712 CardBrowser D updateMultiselectMenu()
10:23:14.200 BrowserMul...ViewHolder D Long press: 1537312828159
10:23:14.200 CardBrowserViewModel D toggled selecting id '1537312828159'; 1 selected
10:23:14.204 CardBrowse...edRowsFlow D refreshed selected rows
10:23:14.205 CardBrowser D onSelectionChanged
10:23:14.205 CardBrowser D updateMultiselectMenu()
10:23:14.207 CardBrowser D load multiselect mode
10:23:14.222 CardBrowser D onCreateOptionsMenu()
10:23:14.241 CardBrowser D onSelectionChanged
10:23:14.241 CardBrowser D updateMultiselectMenu()
10:23:15.175 WindowOnBackDispatcher D onBackInvoked, owner=ViewRootImpl@3feb94e[SingleFragmentActivity], callback=android.view.ViewRootImpl$$ExternalSyntheticLambda19@bf00f21
10:23:15.177 Activity D onKeyDown(KEYCODE_BACK)
10:23:15.177 Activity D onKeyUp(KEYCODE_BACK) isTracking()=true isCanceled()=false hasCallback=false
10:23:15.178 CardBrowserViewModel D selecting none
10:23:15.181 CardBrowse...edRowsFlow D refreshed selected rows
10:23:15.182 CardBrowser D onSelectionChanged
10:23:15.183 CardBrowser D updateMultiselectMenu()
10:23:15.198 CardBrowser D end multiselect mode
10:23:15.200 CardBrowser D onCreateOptionsMenu()
10:23:15.216 CardBrowser D onSelectionChanged
10:23:15.216 CardBrowser D updateMultiselectMenu()
10:23:16.251 BrowserMul...ViewHolder D Long press: 1537513178923
10:23:16.252 CardBrowserViewModel D toggled selecting id '1537513178923'; 1 selected
10:23:16.256 CardBrowse...edRowsFlow D refreshed selected rows
10:23:16.256 CardBrowser D onSelectionChanged
10:23:16.257 CardBrowser D updateMultiselectMenu()
10:23:16.258 CardBrowser D load multiselect mode
10:23:16.260 CardBrowser D onCreateOptionsMenu()
10:23:16.273 CardBrowser D onSelectionChanged
10:23:16.273 CardBrowser D updateMultiselectMenu()
10:23:17.253 WindowOnBackDispatcher D onBackInvoked, owner=ViewRootImpl@3feb94e[SingleFragmentActivity], callback=android.view.ViewRootImpl$$ExternalSyntheticLambda19@bf00f21
10:23:17.255 Activity D onKeyDown(KEYCODE_BACK)
10:23:17.256 Activity D onKeyUp(KEYCODE_BACK) isTracking()=true isCanceled()=false hasCallback=false
10:23:17.256 CardBrowserViewModel D selecting none
10:23:17.260 CardBrowse...edRowsFlow D refreshed selected rows
10:23:17.261 CardBrowser D onSelectionChanged
10:23:17.261 CardBrowser D updateMultiselectMenu()
10:23:17.275 CardBrowser D end multiselect mode
10:23:17.278 CardBrowser D onCreateOptionsMenu()
10:23:17.292 CardBrowser D onSelectionChanged
10:23:17.293 CardBrowser D updateMultiselectMenu()
10:23:18.585 BrowserMul...ViewHolder D Tapped: 1537448757393
10:23:18.610 AnkiDroidApp$onCreate I CardBrowser::onPause
10:23:18.630 Themes I Setting theme to BLACK
10:23:18.634 AnkiDroidApp$onCreate I SingleFragmentActivity::onCreate
10:23:18.641 ScopedStorageService I isLegacyStorage(): current dir: /storage/emulated/0/AnkiDroid
scoped external dirs: /storage/emulated/0/Android/data/com.ichi2.anki.debug/files
scoped internal dir: /data/user/0/com.ichi2.anki.debug/files
10:23:18.641 ScopedStorageService I isLegacyStorage(): true
10:23:18.650 SingleFragmentActivity D Creating fragment com.ichi2.anki.NoteEditor
10:23:18.654 AnkiDroidApp$onCreate I SingleFragmentActivity::onStart
10:23:18.655 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onAttach
10:23:18.656 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onCreate
10:23:18.662 ScrollView D initGoToTop
10:23:18.683 NoteEditor D NoteEditor() onCollectionLoaded: caller: EDIT
10:23:18.695 NoteEditor D updateCards()
10:23:18.695 NoteEditor D updateCards() template count is 1
10:23:18.723 NoteEditor I onCollectionLoaded() Edit note activity successfully started with card id 1537448757393
10:23:18.730 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onViewCreated
10:23:18.732 WindowOnBackDispatcher W OnBackInvokedCallback is not enabled for the application.
Set 'android:enableOnBackInvokedCallback="true"' in the application manifest.
10:23:18.732 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onStart
10:23:18.735 AnkiDroidApp$onCreate I SingleFragmentActivity::onResume
10:23:18.735 UsageAnalytics D sendAnalyticsScreenView(): SingleFragmentActivity
10:23:18.736 UsageAnalytics D getOptIn() status: false
10:23:18.737 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onResume
10:23:18.807 ScrollView D onsize change changed
10:23:18.827 AssistStructure I Flattened final assist data: 5988 bytes, containing 1 windows, 41 views
10:23:19.093 AnkiDroidApp$onCreate I CardBrowser::onStop
10:23:19.096 WidgetStatus D WidgetStatus.update(): already running or not enabled
10:23:19.097 AnkiDroidApp$onCreate I CardBrowser::onSaveInstanceState
10:23:20.073 WindowOnBackDispatcher D onBackInvoked, owner=ViewRootImpl@d555276[SingleFragmentActivity], callback=android.view.ViewRootImpl$$ExternalSyntheticLambda19@224a905
10:23:20.076 Activity D onKeyDown(KEYCODE_BACK)
10:23:20.077 Activity D onKeyUp(KEYCODE_BACK) isTracking()=true isCanceled()=false hasCallback=false
10:23:20.077 NoteEditor I NoteEditor:: onBackPressed()
10:23:20.082 AnkiActivity I finishWithAnimation DEFAULT
10:23:20.091 AnkiDroidApp$onCreate I SingleFragmentActivity::onPause
10:23:20.093 FragmentLifecycleLogger I SingleFragmentActivity::NoteEditor::onPause
10:23:20.101 AnkiDroidApp$onCreate I CardBrowser::onStart
10:23:20.106 CardBrowser D onEditCardActivityResult: resultCode=0
10:23:20.107 AnkiDroidApp$onCreate I CardBrowser::onResume
10:23:20.107 UsageAnalytics D sendAnalyticsScreenView(): CardBrowser
10:23:20.107 UsageAnalytics D getOptIn() status: false
10:23:20.110 CardBrowser D query expansion changed: false
10:23:20.117 CardBrowse...chForCards D performing search: 'deck:"diving" '
10:23:20.122 CardBrowser D end multiselect mode
10:23:20.129 CardBrowse...chForCards D Search returned 634 card(s)
10:23:20.131 CardBrowser D mode change: CARDS - updating spinner titles
10:23:20.132 CardBrowser D onCreateOptionsMenu()
10:23:20.146 CardBrowser D onSelectionChanged
10:23:20.146 CardBrowser D updateMultiselectMenu()
10:23:20.152 CardBrowserViewModel D updating column 1 to SFLD
10:23:20.154 CardBrowserViewModel D updating column 2 to CARD
10:23:20.268 CardBrowser D search state: Searching
10:23:20.269 CardBrowse...chForCards D performing search: 'deck:"diving" '
10:23:20.282 CardBrowse...chForCards D Search returned 634 card(s)
10:23:20.283 AndroidRuntime D Shutting down VM
10:23:20.285 AndroidRuntime E FATAL EXCEPTION: main
Process: com.ichi2.anki.debug, PID: 7283
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 612(offset:612).state:634 androidx.recyclerview.widget.RecyclerView{ff6a139 VFED..... ......ID 0,0-1080,1891 #7f0a013c app:id/card_browser_list}, adapter:com.ichi2.anki.browser.BrowserMultiColumnAdapter@168a12b, layout:androidx.recyclerview.widget.LinearLayoutManager@c38337e, context:com.ichi2.anki.CardBrowser@7af27ef
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6821)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6757)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6753)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2362)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1662)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1622)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:687)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4645)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4348)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4919)
at android.view.View.layout(View.java:25771)
at android.view.ViewGroup.layout(ViewGroup.java:6822)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1103)
at android.view.View.layout(View.java:25771)
at android.view.ViewGroup.layout(ViewGroup.java:6822)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1891)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1729)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1638)
at android.view.View.layout(View.java:25771)
at android.view.ViewGroup.layout(ViewGroup.java:6822)
at androidx.coordinatorlayout.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1213)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:899)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:919)
at android.view.View.layout(View.java:25771)
at android.view.ViewGroup.layout(ViewGroup.java:6822)
at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1263)
at android.view.View.layout(View.java:25771)
at android.view.ViewGroup.layout(ViewGroup.java:6822)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:25771)
at android.view.ViewGroup.layout(ViewGroup.java:6822)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:25771)
at android.view.ViewGroup.layout(ViewGroup.java:6822)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:25771)
at android.view.ViewGroup.layout(ViewGroup.java:6822)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1891)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1729)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1638)
at android.view.View.layout(View.java:25771)
at android.view.ViewGroup.layout(ViewGroup.java:6822)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:1084)
at android.view.View.layout(View.java:25771)
at android.view.ViewGroup.layout(ViewGroup.java:6822)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:5279)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4526)
10:23:20.286 AndroidRuntime E at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3288)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:11344)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1689)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1698)
at android.view.Choreographer.doCallbacks(Choreographer.java:1153)
at android.view.Choreographer.doFrame(Choreographer.java:1079)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1646)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:230)
at android.os.Looper.loop(Looper.java:319)
at android.app.ActivityThread.main(ActivityThread.java:8919)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
10:23:20.286 ThrowableFilterService V exceptionIsUnwanted - examining IndexOutOfBoundsException
Were you able to know the exact steps to reproduce this ?
Logcat should be sufficient to deep dive. I don't have anything more or solid steps, but I reproduced it accidentally
Not sure if it is useful for you to know but I got the same crash today also, just after editing a note.
AnkiDroid Version = 2.21alpha6 (c1f737d76f8f686c827d6eba6035580f5da51870)
Backend Version = 0.1.48-anki24.11 (24.11 c47638ca36f99dd4f3b81ae82d964aec66e392e0)
Android Version = 13 (SDK 33)
ProductFlavor = full
Device Info = motorola | motorola | rhodei | rhodei_g | moto g62 5G | qcom
Webview User Agent = Mozilla/5.0 (Linux; Android 13; moto g62 5G Build/T1SSIS33.1-75-7-11; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.79 Mobile Safari/537.36
ACRA UUID = 38b5ca07-ddb1-4b0e-9d8c-30e3ac117703
FSRS = 1.4.3 (Enabled: true)
Crash Reports Enabled = true
Nothing will have changed, but cheers!
I'm turning my hand towards getting 2.21 out the door when I'm back (to keep in line with Anki 25.01)
This WILL be fixed before it's out
Based on the stack trace, position 7 is flagged as invalid, meaning no entry exists for it in the dataset. This suggests the user tried to access the 7th card in the browser, which was visible in the UI but not in the dataset.
Hypothesis: The dataset and the UI are out of sync. The card may have been removed or modified in the dataset but was still displayed in the CardBrowser due to an incomplete or delayed update to the adapter.
Possible reasons for this: Race condition: Multiple threads may have modified the dataset simultaneously, causing inconsistency. Adapter update failure: The adapter might have failed to successfully update the dataset, though no error was reported. Missed dataset update: The dataset might not have been updated somewhere, leaving stale data visible in the UI.
The issue's unpredictability strongly suggests a race condition. Despite multiple attempts, I could not reproduce it, while @david-allison and user1823 could. This inconsistency aligns with the nature of race conditions, as thread execution is inherently unpredictable, much like the behavior of this issue.
I haven't seen this since the below PR was merged. I would like to get regression cover, but I'd like to confirm whether it's solved
- https://github.com/ankidroid/Anki-Android/pull/17781
Briefly looking at the code, BrowserMultiColumnAdapter is using BrowserRowCollection for the list of items that it shows, and that class is mutable. By making that list immutable we can rule out a huge chunk of issues related to the recycler view's assumption that the dataset must only change immediately before it is notified of changes.
I just scanned ACRA and there no reports of this since alpha6, however, there were not many reports to begin with - literally only 2, both @user1823
So I have no confidence the issue is fixed as sample sizes are too low to infer anything given we couldn't reproduce on demand or anything
I'd leave this open and deprioritize, given OK's suggestion.
We stopped most of the mutation of the list in https://github.com/ankidroid/Anki-Android/pull/17781, we should make it immutable.
I got two crashes today.
Debug info:
AnkiDroid Version = 2.21alpha13 (86145585b3bb251b13ec31d14920485b13c31c46)
Backend Version = 0.1.50-anki25.02 (25.02 038d85b1d9e1896e93a3e4a26f600c79ddc33611)
Android Version = 13 (SDK 33)
ProductFlavor = full
Device Info = motorola | motorola | rhodei | rhodei_g | moto g62 5G | qcom
Webview User Agent = Mozilla/5.0 (Linux; Android 13; moto g62 5G Build/T1SSIS33.1-75-7-12; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.163 Mobile Safari/537.36
ACRA UUID = 38b5ca07-ddb1-4b0e-9d8c-30e3ac117703
FSRS = 2.0.3 (Enabled: true)
Crash Reports Enabled = true
Another crash today. So, the issue is definitely not fixed.
Hello 👋, this issue has been opened for more than 3 months with no activity on it. If the issue is still here, please keep in mind that we need community support and help to fix it! Just comment something like still searching for solutions and if you found one, please open a pull request! You have 7 days until this gets closed automatically
Another crash today after a long time.
- AnkiDroid Version = 2.21alpha16 (389b26d65032182a56734d1595db49c2bf268bfc)
- Android Version = 13 (SDK 33)
- ACRA UUID = 38b5ca07-ddb1-4b0e-9d8c-30e3ac117703