RecyclerView状态异常Cannot call this method while RecyclerView is computing a layout or scrolling

这篇具有很好参考价值的文章主要介绍了RecyclerView状态异常Cannot call this method while RecyclerView is computing a layout or scrolling。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

错误堆栈

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.recyclerview.widget.RecyclerView.............layout:androidx.recyclerview.widget.GridLayoutManager@ca48e86, context:..........@a799d74
	at androidx.recyclerview.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2880)
	at androidx.recyclerview.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:5281)
	at androidx.recyclerview.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:11997)
	at androidx.recyclerview.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:7070)
......
at android.os.Handler.handleCallback(Handler.java:938)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:240)
	at android.app.ActivityThread.main(ActivityThread.java:8000)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:603)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

报错代码

在RecyclerView中抛异常的地方
cannot call this method while,Android,java,android,开发语言在RecyclerView进行数据更新的时候,会进行判断当前RecyclerView是否正在布局遍历或者滚动,如果是就抛出异常
cannot call this method while,Android,java,android,开发语言
cannot call this method while,Android,java,android,开发语言

isComputingLayout方法

cannot call this method while,Android,java,android,开发语言这个方法用来判断RecyclerView当前是否在计算布局,这段注释的意思是:

返回RecyclerView当前是否正在计算布局。
如果此方法返回true,则意味着RecyclerView处于锁定状态
尝试更新适配器内容将导致异常,因为适配器内容
当RecyclerView尝试计算布局时,无法更改。
您的代码不太可能在这种状态下运行
当发生布局遍历或RecyclerView开始滚动时,由框架调用
响应系统事件(触摸、可访问性等)。
如果您有一些自定义逻辑来更改中的适配器内容,则可能会发生这种情况
对视图回调(例如焦点更改回调)的响应
布局计算。在这些情况下,您应该使用Handler或类似的机制。
返回true,如果RecyclerView当前正在计算布局,false否则

注释里面说,在这种情况下应该使用Handler来处理

mLayoutOrScrollCounter这个变量注释
cannot call this method while,Android,java,android,开发语言意思是

在dispatchLayout和/或滚动期间,此变量递增。
在这些期间不应调用某些方法(例如适配器数据更改)。
这样做会导致很难找到bug,所以我们最好检查一下并抛出异常。
参见#assertInLayoutOrScroll(字符串)
参见#assertNotInLayoutOrScroll(字符串)

所以这个变量大于0就表示RecyclerView当前正在布局或滚动。

解决办法

综上所诉,当出现这个异常的时候,应当把数据更新的代码放在handler中。文章来源地址https://www.toymoban.com/news/detail-530326.html

new Handler(Looper.getMainLooper()).post(new Runnable() {
                               @Override
                               public void run() {
                                   mAdapter.notifyDataSetChanged();
                               }
                           }
        );

到了这里,关于RecyclerView状态异常Cannot call this method while RecyclerView is computing a layout or scrolling的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包