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 tasks
和 finished tasks
添加到 recyclerview
并且每个部分都有其项目计数的大小,第二部分的开始位置将根据 unfinished tasks
大小而改变
例如,我有5 Tasks
,它们都在unfinished tasks
部分中,因此通过单击RecyclerView
中的项目,任务将完成,现在我需要调用notifyDataSetChanged();
,结果将是4 items in Unfinished Tasks section
和 1 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()”