RecyclerView的bug——Inconsistency detected

2023-11-01 18:48

本文主要是介绍RecyclerView的bug——Inconsistency detected,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

bug重现的方法

使用 RecyclerView 加SwipeRefreshLayout下拉刷新的时候,如果绑定的 List 对象在更新数据之前进行了 clear,而这时用户紧接着迅速上滑 RecyclerView,就会造成崩溃,而且异常不会报到我们的代码上,属于RecyclerView内部错误。

可能的原因

当 clear 了 list 之后,这时迅速上滑,而新数据还没到来,导致 RecyclerView 要更新加载下面的 Item 时候,找不到数据源了,造成 crash,就会报以下错误

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 157(offset:157).state:588at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3300)at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3258)at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1803)at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1302)at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1265)at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1093)at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:956)at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:2715)at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)at android.view.Choreographer.doCallbacks(Choreographer.java:555)at android.view.Choreographer.doFrame(Choreographer.java:524)at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)at android.os.Handler.handleCallback(Handler.java:615)at android.os.Handler.dispatchMessage(Handler.java:92)at android.os.Looper.loop(Looper.java:137)at android.app.ActivityThread.main(ActivityThread.java:4921)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:511)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)at dalvik.system.NativeStart.main(Native Method)

解决方法

在刷新时,也就是 clear 的同时,让 RecyclerView 暂时不能够滑动,之后再允许滑动即可。代码就是在 RecyclerView 初始化的时候加上是否在刷新进而拦截手势,需要一个布尔型变量判断是否正在刷新,在刷新时设置为true,刷新完毕后设置为false,相关代码如下

private boolean mIsRefreshing=false;
mRecyclerView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if (mIsRefreshing) {return true;} else {return false;}}}
);
//当刷新时设置
//mIsRefreshing=true;
//刷新完毕后还原为false
//mIsRefreshing=false;

总结

显然进制滑动不明智,但是在没找到其他方式解决之前,这也不失为一个办法。

这篇关于RecyclerView的bug——Inconsistency detected的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/325000

相关文章

JavaBug系列-解决SpringBoot返回Xml结构的问题

JavaBug系列之SpringBoot返回Xml结构的问题 Java医生一、关于错误信息二、如何解决问题 Java医生 本系列记录常见Bug,以及诊断过程和原因 作者:Java医生 教学: Java企业项目辅导,专注于辅导新入职员工,解决各种问题! V:study_51ctofx 一、关于错误信息 如图,SpringBoot请求返回Xml格式信息 通过以上信息分析,

JavaBug系列- Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class load

JavaBug系列之Mysql驱动问题 Java医生一、关于错误信息二、如何解决问题 Java医生 本系列记录常见Bug,以及诊断过程和原因 Java/一对一零基础辅导/企业项目一对一辅导/日常Bug解决/代码讲解/毕业设计等 V:study_51ctofx 一、关于错误信息 APPLICATION FAILED TO START Description: Fai

【解决bug之路】npm install node-sass(^4.14.1)连环报错解决!!!(Windows)

有关node-sass的深入分析可参考:又报gyp ERR!为什么有那么多人被node-sass 坑过? 主要有如下三方面错误,请自查: 1.node,npm版本需与node-sass版本匹配,像node-sass(^4.14.1)就得node 14.x版本才可以,node 16不行 gyp ERR! build error15 gyp ERR! stack Error: `

排查 MyBatis XML 配置中的 IF 语句与传值名称不匹配的 Bug

文章目录 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 前言,在改一个bug得时候发现一个有意思得问题,就是mybatis得xml中if判断得问题,传值名字不匹配依旧可以进行判断,如下图 传值userName,但是有意思得事情出现了,进了if,并且没有报错,尝试了两次都是这

彻底解决魅族手机无法彻底卸载应用的bug

使用Flyme系统的同学可能会遇到一个问题: 卸载了某些软件(例如通过开发者模式调试安装的应用)后,实际这个应用还残留在系统,当你用低版本或者其他签名的apk覆盖安装的时候会提示“安装失败”,要求你卸载后重新安装。 可是无论你从应用列表寻找还是清理垃圾,都根本找不到这个应用。 闹鬼?这个bug一直伴随着flyme,可怜工程师们竟然一个都没发现。 今天笔者教大家一招解决这个问题。

今天做了freemaker 导出word文档 的bug修复,解决 \n换行 问题

结合Freemaker导出文件 public void exportSimpleWord() throws Exception{// 要填充的数据, 注意map的key要和word中${xxx}的xxx一致Map<String,String> dataMap = new HashMap<String,String>();dataMap.put("username", "张三");dataMap.

RecyclerView的itemView的点击效果

1,需要在 itemView 的布局 根节点上添加  android:clickable="true" 2、或者通过代码实现 @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {  ((ViewHolder)viewHolder).textView

【软件测试】软件测试-----什么是Bug?Bug是如何分级的?Bug的生命周期是怎样的?如何描述一个Bug?

博客目录 一.软件测试的生命周期二.BUG的定义和级别2.1 bug的概念.2.2 如何描述一个bug.2.3bug的级别2.3.1 bug分级的意义.2.3.2 bug的四种级别. 三.BUG的生命周期.四.当与开发人员发生冲突该如何处理(高频面试)五.总结 一.软件测试的生命周期 软件测试贯穿于软件的整个生命周期,针对这句话我们一起来看一下软件测试是如何贯穿软件的整个生命周

Win10 - 即插即用的external audio device detected问题

问题     有些牌子的笔记本,在win10下每次插入外设耳机,都会跳出带有 external audio device detected 字样的音频输出设备选择框需要选择 方案     1、在开始菜单选择 运行 ,输入 regedit 后回车打开注册表     2、在注册表中定位到 HKEY_CURRENT_USER\SOFTWARE\Realtek\Audio\RtkNGUI64

【ListView】有关填充bug

假设要实现如下效果 ListView里若使用RelativeLayot则会出现错误 得不到垂直线的填充 线性布局的高度设置为match_parent会使高度为0,必须给它一个固定值,比如20dp ListView建议使用LinearLayout在最外层,而最外层的宽高无论如何设置都无法确定的,建议第二层也使用linearLayout来布局 【实现