Fixed modules screen crashing on load
This commit fixes the issue of adding single-span items in between full-span items whilst using `StaggeredGridLayoutManager` on recycler view. Adding such items results in: ``` java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 13 at java.util.Arrays.rangeCheck(Arrays.java:123) at java.util.Arrays.fill(Arrays.java:2828) at androidx.recyclerview.widget.StaggeredGridLayoutManager$LazySpanLookup.invalidateAfter(StaggeredGridLayoutManager.java:2876) at androidx.recyclerview.widget.StaggeredGridLayoutManager.handleUpdate(StaggeredGridLayoutManager.java:1548) at androidx.recyclerview.widget.StaggeredGridLayoutManager.onItemsUpdated(StaggeredGridLayoutManager.java:1524) at androidx.recyclerview.widget.RecyclerView$6.dispatchUpdate(RecyclerView.java:1021) at androidx.recyclerview.widget.RecyclerView$6.onDispatchSecondPass(RecyclerView.java:1032) at androidx.recyclerview.widget.AdapterHelper.consumePostponedUpdates(AdapterHelper.java:121) at androidx.recyclerview.widget.AdapterHelper.consumeUpdatesInOnePass(AdapterHelper.java:557) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4128) at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851) at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404) ...and more ``` Affects versions including and prior to androidx.recyclerview:recyclerview:1.2.0-alpha02 (at the time of this commit) and possibly more after that. This bug is caused by a single fact and that is - array inside of `LazySpanLookup` is not being invalidated and resized correctly when non-full-span item is being added in between of two full-span items. The invalidation however passes on some (high performance) devices so it doesn't necessarily cause issues for _some_ users; others keep getting the same crash over and over again. Possible fix for anyone reading this, in the hope of fixing the same error, is to copy-paste the `StaggeredGridLayoutManager` and fix the array length before calling `Arrays.fill()`. There's no fix from user's perspective if you need to keep the UI as-is. We however don't need the UI as-is, so we're instead opting to use LinearLayoutManager until is the issue resolved. Continues tracking at https://issuetracker.google.com/issues/37034096 Close #2631
This commit is contained in:
parent
e0a281583d
commit
d810e6c82d
@ -17,6 +17,17 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<!--
|
||||
The list is reverted to use LinearLayoutManager only. The issue of random crashes lies in
|
||||
the way StaggeredGridLayoutManager invalidates view in LazySpanLookup. Since we're adding
|
||||
items in between full-span items the array is not yet invalidated and consecutively crashes
|
||||
due to index of -end- being out of bounds of the current array.
|
||||
|
||||
If you'd like to use StaggeredGridLayoutManager, do so without adding single span items in
|
||||
between of full-span items.
|
||||
https://issuetracker.google.com/issues/37034096
|
||||
-->
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/module_list"
|
||||
adapter="@{viewModel.adapter}"
|
||||
@ -34,8 +45,7 @@
|
||||
android:paddingTop="@{viewModel.insets.top + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingBottom="@{viewModel.insets.bottom + (int) @dimen/internal_action_bar_size + (int) @dimen/l1}"
|
||||
app:layoutManager="androidx.recyclerview.widget.StaggeredGridLayoutManager"
|
||||
app:spanCount="2"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
tools:listitem="@layout/item_module_md2" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
|
Loading…
Reference in New Issue
Block a user