From e3f495e35261e46ae818c7d32b96ee9a1bae472a Mon Sep 17 00:00:00 2001 From: andrekir Date: Tue, 26 Mar 2024 08:06:10 -0300 Subject: [PATCH] fix: add `LinearLayoutManager` wrapper for `RecyclerView` bug workaround --- .../com/geeksville/mesh/ui/UsersFragment.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt index 90c6a1f31..a6bcab437 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt @@ -1,6 +1,7 @@ package com.geeksville.mesh.ui import android.animation.ValueAnimator +import android.content.Context import android.content.res.ColorStateList import android.graphics.Color import android.os.Bundle @@ -24,12 +25,27 @@ import com.geeksville.mesh.android.Logging import com.geeksville.mesh.databinding.NodelistFragmentBinding import com.geeksville.mesh.model.UIViewModel import com.geeksville.mesh.ui.theme.AppTheme +import com.geeksville.mesh.util.Exceptions import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +/** + * Workaround for RecyclerView bug throwing: + * java.lang.IndexOutOfBoundsException - Inconsistency detected. Invalid view holder adapter + */ +private class LinearLayoutManagerWrapper(context: Context) : LinearLayoutManager(context) { + override fun onLayoutChildren(recycler: RecyclerView.Recycler?, state: RecyclerView.State?) { + try { + super.onLayoutChildren(recycler, state) + } catch (ex: IndexOutOfBoundsException) { + Exceptions.report(ex, "onLayoutChildren") + } + } +} + @AndroidEntryPoint class UsersFragment : ScreenFragment("Users"), Logging { @@ -224,7 +240,7 @@ class UsersFragment : ScreenFragment("Users"), Logging { super.onViewCreated(view, savedInstanceState) binding.nodeListView.adapter = nodesAdapter - binding.nodeListView.layoutManager = LinearLayoutManager(requireContext()) + binding.nodeListView.layoutManager = LinearLayoutManagerWrapper(requireContext()) model.nodeDB.nodeDBbyNum.asLiveData().observe(viewLifecycleOwner) { nodesAdapter.onNodesChanged(it.values.toTypedArray())