RecyclerView在刷新时滚动时崩溃

Posted

技术标签:

【中文标题】RecyclerView在刷新时滚动时崩溃【英文标题】:RecyclerView Crashing when scrolling while refreshing 【发布时间】:2021-12-31 15:56:51 【问题描述】:

我正在回收站视图中显示一些从 WordpressAPI 获得的文章。为了触发重新加载,我使用了 SwipeRefreshLayout。当应用程序加载新文章时用户重新加载并向下滚动时,应用程序崩溃并且我收到以下错误

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionThomsLineArticleViewHolder5c87efc position=2 id=-1, oldPos=-1, pLpos:-1 no parent

我将文章存储在一个 Viewmodel 中,每包 10 个(也就是来自 Wordpress 的页面),这是我用来更新给定页面的代码:

fun setArticlePage(id: Int, content:ThomsLineWordpressArticlePage, recyclerAdapter: ThomsLineRecyclerAdapter)

        //Only do Something if actually something changed
        if (_articles.value == null || id >= _articles.value!!.size || (id < _articles.value!!.size && !_articles.value!!.get(id).equals(content))) 
            //If there were no articles previously
            if (_articles.value == null) _articles.value = arrayListOf(content)

            //if the Page is completly new
            else if (id >= _articles.value!!.size) _articles.value?.add(content)

            //If it's just a old Page updating
            else if (id < _articles.value!!.size) _articles.value?.set(id, content)

            // Save the new Values
            _articles.postValue(_articles.value)
            
            //Update Recycler View
            recyclerAdapter.notifyItemChanged(id)
        
    

编辑:我应该说当用户不滚动时没有错误,当用户在重新加载时滚动时应用程序会崩溃

【问题讨论】:

【参考方案1】:

当您尝试刷新(recyclerAdapter.notifyItemChanged(id)) 回收器视图而其最后一次更新操作尚未完成时会发生不一致。

问题中没有什么不清楚的。 您是否在循环内调用 setArticlePage 方法?然后你应该在循环完成后刷新回收器视图。

除此之外,尝试一次加载新文章一页。在最后一次调用 API 完成之前,不允许加载新的文章页面。

【讨论】:

我正在浏览所有页面并为每个页面发送请求。以前,每次响应返回时,我都会更新 RecyclerView。可悲的是,将其更改为仅在最后一个视图返回时更新视图后,错误仍然存​​在。这也不能解释为什么错误只是在用户滚动时发生。 @isi_ko 在调用下一页之前,您应该等待响应。我需要有关您在回收站视图中设置数据所使用的逻辑的更多信息。【参考方案2】:

对不起,错误实际上不是 RecyclerView 本身,而是我的代码的其他部分:我总是将页面加载到给定点,之后的所有页面都被删除,这说明虽然加载新页面,RecyclerView 想要访问的值实际上没有加载。

对不起,耽误了你的时间

【讨论】:

以上是关于RecyclerView在刷新时滚动时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在 recyclerview 滚动 android kotlin 时崩溃

CoordinatorLayout 中的 RelativeLayout 不滚动

RecyclerView 的 IBinder RuntimeException,但它不会使应用程序崩溃

RecyclerView的行项目视图隐藏/显示在Recyclerview的滚动上搞砸了

Android Studio第三十一期 - 记录RecyclerView滚动位置并恢复

无尽的recyclerview,多种视图类型,OnscrollListener 后崩溃