Android问题笔记四十四:关于RecyclerView出现Inconsistency detected崩溃

  • 点击跳转=>Unity3D特效百例
  • 点击跳转=>案例项目实战源码
  • 点击跳转=>游戏脚本-辅助自动化
  • 点击跳转=>Android控件全解手册
  • 点击跳转=>Scratch编程案例
  • 点击跳转=>软考全系列

👉关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,交流让学习不再孤单

在这里插入图片描述

👉实践过程

😜问题

近来项目里,RecyclerView 更新数据偶尔出现 crash,错误日志如下:

    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{2064e5c6 position=2 id=-1, oldPos=2, pLpos:-1 scrap [attachedScrap] tmpDetached no parent}at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:4505)at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4636)at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617)at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994)at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390)at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353)at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574)at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:2979)at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2904).....

这类问题出现的原因是数据变化和更新不同步造成的,不如你 clear 了,然后又等接口请求完毕 add 了,只进行了一次 adapter 更新,再比如你在滑动的过程中,数据源被你的某个业务逻辑改变了数据。
总之就是突出一个思想:数据的任何一次变动没有及时进行 adapter 的更新造成的。
遇到这类错误 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder,通过查阅 Stackoverflow 和资料,总结了如下情况和解决方法:

😜解决

方法一

自己写一个继承 LinearLayoutManager 的包装类,在 onLayoutChildren() 方法里 try-catch 捕获该异常。

@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {try {super.onLayoutChildren(recycler, state);} catch (IndexOutOfBoundsException e) {e.printStackTrace();}
}

方法二

在进行数据移除和数据增加时,务必要保证 RecyclerView 的 Adapter 中的数据集和移除/添加等操作后的数据集保持一致!

这里,前者是在该 Adapter 内部,不妨叫做内部数据集,后者是开发人员传过给 Adapter 的,不妨叫外部数据集。更新RecyclerView 数据时,需要保证外部数据集和内部数据集实时保持一致。

外部数据集同步到内部数据集,使用如下的方法:

  • notifyItemRangeRemoved();
  • notifyItemRangeInserted();
  • notifyItemRangeChanged();
  • notifyDataSetChanged();

这里对 notifyDataSetChange() 做些说明:
使用该方法的更新内部数据集,没有默认的动画效果,同时更新数据的效率页不如上面的方法,官方不推荐使用这种方式更新数据集。

    Don’t call notifyDataSetChanged if you don’t have to.

RecyclerView 的 Adapter 里,发生异常的错误代码如下:

public void notifyData(List<PoiItem> poiItemList) {if (poiItemList != null ) {mPoiItems.clear();mPoiItems.addAll(poiItemList);notifyItemRangeChanged(0, poiItemList.size());}
}

错误分析:
mPoiItems 是外部数据集,对该外部数据集做了两个操作:先移除数据,然后添加数据,之后 notify 数据集。这里,添加数数据时( Adapter 的内部数据集内容还处在外部数据集移除数据之前),造成了内部和外部数据集不一致。

这是一方面,另一方面,我使用了 notifyItemRangeChanged() 来更新数据,如果 poiItemList 传过来的新数据和原来 mPoiItems 的数据数量不一致,就会出现内部数据集和外部数据在同步后不一致,从而报错。

修复后,运行正常的代码如下:

public void notifyData(List<PoiItem> poiItemList) {if (poiItemList != null) {int previousSize = mPoiItems.size();mPoiItems.clear();notifyItemRangeRemoved(0, previousSize);mPoiItems.addAll(poiItemList);notifyItemRangeInserted(0, poiItemList.size());}
}

修复分析:

每一次对外部数据集做改动时,都需要紧接着主动对外部数据集和内部数据集做一次同步操作,动画效果也得到了保持(使用方法三,动画效果缺失)

方法三:

使用 notifyDataSetChanged 同步外部数据集和内部数据集。该方法简单,但是失去了动画效果,并且更新数据的性能低。

use notifyDataSetChanged() will avoid this crash, but it will kill Animation and Performance.

另外,如果对外部数据集做了二次以上的操作,却只调用notifyDataSetChanged同步一次,也很有可能会报上文所示的错误。

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
空名先生

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AppLink上的小鹅通能实现什么操作呢?

AppLink实现小鹅通信息同步操作 本篇文章给大家演示下小鹅通可在AppLink平台上快速实现的同步操作&#xff0c;1.用户注册或更换手机号信息同步 2.小鹅通产生新的购买订单&#xff0c;订单信息同步。 以下操作均需获得小鹅通授权 授权后登录AppLink操作台&#xff0c;在【我的…

ajax异步传值以及后端接收参数的几种方式

异步传值 第一种呢&#xff0c;也是最简单的一种&#xff0c;通过get提交方式&#xff0c;将参数在链接中以问号的形式进行传递 // 前台传值方法 // 触发该方法调用ajaxfunction testAjax(yourData) {$.ajax({type: "get", // 以get方式发起请求url: "/yo…

HackTheBox-Starting Point--Tier 2---Included

文章目录 一 Included 测试过程1.1 打点1.2 横向移动1.3 权限提升 二 题目 一 Included 测试过程 1.1 打点 1.端口扫描 nmap -sV -sC 10.129.193.212.访问web站点 3.文件包含漏洞探测 观察请求地址&#xff1a;http://10.129.193.21/?filehome.php&#xff0c;利用file参数动…

【Spring】 Spring中的IoC(控制反转)

以往在定义业务层实现时&#xff0c;在指定具体地Dao时候需要具体地定义出其实现&#xff1a; public class BookServiceImpl implements BookService{private BookDao bookDao new BookDaoImpl();public void save(){bookDao.save()} }public class BookDaoImpl implements …

Excel处理库openpyxl的使用

读取工作表 from openpyxl import load_workbook wbload_workbook("学生成绩表.xlsx") wb.get_sheet_names() a_sheetwb.get_sheet_by_name(计算机应用3班) print(a_sheet.title) b_sheetwb.active print("激活的sheet:{}".format(b_sheet)) #获取单个单元…

只有开源才能拯救AI

导语 | 随着 AI 技术的蓬勃发展&#xff0c;大模型的开源化正成为人工智能领域的新潮流&#xff0c;但同时引发的伦理和安全风险也饱受大家关注&#xff0c;如何把握平衡其中的尺度成为开源的一大难题。我们又应该如何有效进行开源治理&#xff1f;未来将走向何方&#xff1f;今…

二叉树题目:统计二叉树中好结点的数目

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;统计二叉树中好结点的数目 出处&#xff1a;1448. 统计二叉树中好结点的数目 难度 5 级 题目描述 要求 给定一…

IEEE Standard for SystemVerilog—Chapter14. Clocking blocks

14.1 General This clause describes the following: — Clocking block declarations(时钟块声明) — Input and output skews(输入和输出偏斜) — Clocking block signal events(时钟块信号事件) — Cycle delays(周期延迟) — Synchronous events(同步事件) — Synchronous…

Nginx静态资源部署之响应内容部署

文章目录 Nginx静态资源概述Nginx静态资源的配置指令listen指令server_name指令匹配执行顺序 location指令设置请求资源的目录root / aliasindex指令error_page指令 Nginx静态资源概述 Nginx处理静态资源的内容&#xff0c;我们需要考虑下面这几个问题&#xff1a; &#xff…

1700亿烧光,利润暴跌78%!外媒:中芯国际不是麒麟9000S的代工厂

作为芯片代工领域的领导者&#xff0c;台积电在全球半导体市场上占据着重要的地位。然而&#xff0c;由于美国对华为的制裁&#xff0c;台积电关闭了对华为麒麟芯片的代工&#xff0c;这也引发了外界对于芯片代工模式的讨论。与此同时&#xff0c;中芯国际作为大陆规模最大、技…

计算机网络专栏 学习导航or使用说明

计算机网络各章笔记 计算机网络_第一章_计算机网络的概述 计算机网络_第二章_物理层 计算机网络_第三章_数据链路层 计算机网络_第四章网络层_网络层概述_网际协议IP 计算机网络各章习题 计算机网络第一章习题_网络概述 计算机网络第二章习题_物理层 计算机网络第三章习…

能够解决网站被攻击的云服务厂商

在当今数字化时代&#xff0c;网站被攻击已成为一个严峻的挑战。在这样的情况下&#xff0c;云服务机构和CDN&#xff08;内容分发网络&#xff09;发挥着至关重要的作用&#xff0c;它们为网站提供了有效的保护手段。本文将介绍网站被攻击时可以求助的云服务机构&#xff0c;并…

Ubuntu22.04离线安装uwsgi问题记录

GCC4.8安装 1、报错信息1&#xff1a; 由于缺少gcc4.8环境导致的无法安装uwsgi 解决方案&#xff1a; 离线安装GCC4.8环境, GCC4.8.5离线安装步骤如下&#xff1a; 1、下载gcc的离线安装包及其依赖包&#xff0c;链接如下&#xff1a; https://download.csdn.net/download/…

idea运行项目之后一直卡在Writing classes… 解决方案

最近遇到idea里直接运行一个Spring boot项目后&#xff0c;idea一直慢悠悠的parsing java&#xff0c;然后就writing classes&#xff0c;然后就一直卡着不动了&#xff0c;运气好10几分钟能把项目启动起来。 多年的摸鱼经验告诉我&#xff0c;事出反常必有妖&#xff0c;赶紧…

Adam算法

一、Adam算法的原理 Adam算法结合了动量梯度下降法和RMSProp算法的思想&#xff0c;采用自适应学习率和二阶矩估计来更新模型参数。下面我们来详细介绍Adam算法的工作原理。 动量梯度下降法&#xff1a; 动量梯度下降法引入了动量的概念&#xff0c;通过累积过去梯度的移动平…

35、Flink 的 Formats 之CSV 和 JSON Format

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

使用.net 构建 Elsa Workflow

对接过蓝凌OA 也基于泛微OA数据库原型重新研发上线过产品&#xff0c;自研的开源的也上线过 每个公司对OA流程引擎介绍 都不一样的&#xff0c; 比如Elsa 这款微软MVP开源组件&#xff0c;基于跨平台开发的技术含量高&#xff0c;专门做OA的同行推过对应文章。 直接看怎么用吧。…

DeepStream--测试代码

测试BufSurface分配 #include <cstdio> #include <cuda_runtime_api.h> #include <nvbufsurface.h> int main() {NvBufSurface* hst_surf nullptr;NvBufSurfaceCreateParams buf_params {0};int status -1;buf_params.width 1920;buf_params.height 1…

新版本!飞凌嵌入式RK3568系列开发板全面支持Debian 11系统

飞凌嵌入式OK3568-C/OK3568J-C开发板现已全面支持Debian 11系统&#xff0c;新系统的加持能为用户提供主控新选择&#xff0c;并为开发者带来更多开发便利&#xff01; Debian系统作为一种广受欢迎和信赖的开源操作系统&#xff0c;以其稳定性、可靠性和开放性而闻名&#xff0…

MySQL(16):变量、流程控制与游标

变量 在MySQL数据库的存储过程和函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据。 在 MySQL 数据库中&#xff0c;变量分为 系统变量 以及 用户自定义变量 。 系统变量 变量由系统定义&#xff0c;不是用户定义&#xff…