Recyclerview部分:调用notifyDataSetChanged()时出现IllegalStateException [重复]

Posted

技术标签:

【中文标题】Recyclerview部分:调用notifyDataSetChanged()时出现IllegalStateException [重复]【英文标题】:Recyclerview Sections : IllegalStateException when call notifyDataSetChanged() [duplicate] 【发布时间】:2022-01-16 02:23:30 【问题描述】:

通过在我的应用程序中使用 this simple section adapter 在 RecyclerView 中创建两个部分,一切都很好,但问题出在 SimpleSectionedRecyclerViewAdapter.java 类中 当调用notifyDataSetChanged();

错误代码是:

 mBaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() 
        @Override
        public void onChanged() 
            mValid = mBaseAdapter.getItemCount()>0;
            notifyDataSetChanged();              //<------------------------the error is here
        

        @Override
        .
        .
        .
    );

在我的片段中,我将两种类型的数据 unfinished tasksfinished tasks 添加到 recyclerview 并且每个部分都有其项目计数的大小,第二部分的开始位置将根据 unfinished tasks 大小而改变

例如,我有5 Tasks,它们都在unfinished tasks 部分中,因此通过单击RecyclerView 中的项目,任务将完成,现在我需要调用notifyDataSetChanged();,结果将是4 items in Unfinished Tasks section1 item will added to finished task section

一切正常,但recyclerView 中的数据没有更改,当我调用notifyDataSetChanged(); 时,应用程序崩溃并显示错误:

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.recyclerview.widget.RecyclerView

所以我评论notifyDataSetChanged();RecyclerView 中的数据当我重新打开片段时未更改接受

任何帮助我该如何解决这个问题?

【问题讨论】:

这个project 似乎已被废弃 - 它甚至可能只使用旧版本的 Android Studio 构建。 【参考方案1】:

此方法可能会导致事件循环,IDE 应指示循环调用。

@Override
public void onChanged() 
     // ever wondered, which event this may trigger?
     notifyDataSetChanged();

根本无法在适配器状态/回调中调用notifyDataSetChanged()。即使你设法从另一个线程调用它,它也会一遍又一遍地调用它自己……而且随着每次新调用,它可能只会越来越停顿。

【讨论】:

以上是关于Recyclerview部分:调用notifyDataSetChanged()时出现IllegalStateException [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android-RecyclerView系列 RecyclerView滚动指定位置到屏幕中间

RecyclerView.onBindViewHolder 只调用一次

Recyclerview 不调用 onCreateViewHolder

Android之解决NestedScrollView嵌套RecyclerView部分手机返回到这个页面Recyclerview顶部,而不是页面NestedScrollView顶部

Android之解决NestedScrollView嵌套RecyclerView部分手机返回到这个页面Recyclerview顶部,而不是页面NestedScrollView顶部

尝试在空对象引用上调用虚拟方法“void androidx.recyclerview.widget.RecyclerView.setLayoutManager()”