RecyclerView在添加数据的时候发生了异常.

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{f82aa71 position=11 id=-1, oldPos=6, pLpos:6 scrap [attachedScrap] tmpDetached not recyclable(1) no parent}at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5297)at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5479)at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440)at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436)at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224)at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551)at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3534)at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3310)...
复制代码

RecyclerView#validateViewHolderForOffsetPosition(ViewHolder holder)

if (holder.mPosition < 0 || holder.mPosition >= mAdapter.getItemCount()) {throw new IndexOutOfBoundsException("Inconsistency detected. Invalid view holder "+ "adapter position" + holder);}
复制代码

holder.mPosition >= mAdapter.getItemCount()为真,抛出了异常 发现mAdapter.getItemCount() 的值是正常的,但是holder.mPosition值有问题,在某种情况下和getItemCount的值一样大,此时条件为真。

接下来看了下RecyclerView中有5个方法改变了mPosition的值,分别是

  • Adapter#bindViewHolder()
  • ViewHolder#resetInternal()
  • ViewHolder#offsetPosition()
  • ViewHolder#flagRemovedAndOffsetPosition()
  • Recycler#tryGetViewHolderForPositionByDeadline()

分别打了断点,发现会引起崩溃的代码,会改变mPosition的有其中三个地方resetInternal()offsetPosition()bindViewHolder()resetInternal() 首先排除 ,因为mPosition = NO_POSITION;

然后仔细查看offsetPosition()bindViewholder()中的值发现,offsetPosition()的值mPosition += offset;会超出mPosition的值的范围。 所以现在就要去找这个方法被调用的时机和offset这个值的含义

  1. 查看offsetPosition()的调用,发现调用分别来自RecyclerView与RecyclerView.Recycler两个的对应的insert,moveremove方法,以及ViewHolderflagRemovedAndOffsetPosition(int, int, boolean)的方法 主要看就下面这个
void offsetPositionRecordsForInsert(int positionStart, int itemCount) {//...//这里将itemCount 传递给了offsetPositionholder.offsetPosition(itemCount, false);//...mRecycler.offsetPositionRecordsForInsert(positionStart, itemCount);requestLayout();}
复制代码

看起来在某个刷新数据的地方理解错了itemCount,找到我自己Adapter代码里面的 notifyItemRangeInserted(positionStart,itemCount);暂时修改为notifyDataSetChanged()不会报错了

转载于:https://juejin.im/post/5a31ee3a6fb9a045132ab606

Inconsistency detected Invalid view holder adapter position相关推荐

  1. 解决IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter

    解决IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter 最近项目已个要求,recyclervi ...

  2. java.lang.IndexOutOfBoundsExceptionInconsistency detected. Invalid view holder adapter position问题处理

    工作中发现bugly上报了一个崩溃,日志如下: java.lang.IndexOutOfBoundsExceptionInconsistency detected. Invalid view hold ...

  3. Inconsistency detected. Invalid view holder adapter positionVH

    recycleview报错,是因为我的list引用了静态变量的list,直接=了,应该是list.addAll(静态变量list)

  4. RecyclerView问题:java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adap

    ###写在前面 在使用RecyclerView中出现了一个问题,如下图 ###解决办法: 我们在使用RecycxlerView时,通常先回设置一个LayoutManager 我们的问题出现在Layou ...

  5. Recyclerview 出现 java.lang.IndexOutOfBoundsException: Inconsistency detected 异常

    使用 RecyclerView 的时候报错 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view hold ...

  6. RecyclerView的Inconsistency detected报错解决办法

    最近在又一次遇到RecyclerView的Inconsistency detected报错后,研究了一下,终于清楚了问题所在,以及解决办法. 报错模拟: 先看一下报错日志 能看到最先的报错是Index ...

  7. pytorch view(): argument 'size' (position 1) must be tuple of ints, not Tensor

    view(): argument 'size' (position 1) must be tuple of ints, not Tensor pytorch的view函数参数不能是tensor,解决方 ...

  8. Jboss集群异常WELD-000227: Bean identifier index inconsistency detected

    wildfly9集群环境,集群启动后出现异常: WELD-000227: Beanidentifier index inconsistency detected - the distributed c ...

  9. 记一次全民K歌的crash定位过程

    全民K歌4.6版本发布后,出现了一个与RecyclerView相关的IllegalArgumentException,作此记录. 一.问题 从下面堆栈中可以看出,RecyclerView此时正在执行布 ...

最新文章

  1. 反应式系统实现MQTT客户机
  2. 报名 | IBM苏中:从深蓝到AlphaGo,从大数据到认知商业
  3. 6.排序算法最优的时间复杂度
  4. OpenCV_轮廓的查找、表达、绘制、特性及匹配
  5. Appointment在SPRO里的date profile配置
  6. php提取汉字拼音首字母,php获取汉字拼音首字母的函数(真正可以使用的)
  7. [转载] Python之Numpy模块中的方法详解
  8. 普通交换机上的网卡绑定
  9. webpack 使用教程
  10. 草根学Python(十四) 一步一步了解正则表达式
  11. sql常识- UNIQUE
  12. Delphi Note
  13. 深度学习小笔记04-魏秀参《解析深度学习-卷积神经网络原理与视觉实践》
  14. 中国图形图象学报和计算机科学,《中国图象图形学报》编辑部
  15. 如何理解阿里月饼事件中各方的表现
  16. Ring buffer streaming in general - how to imple...
  17. 【JavaWeb】之Tomcat介绍、安装与使用
  18. 越来越觉得马克思主义原理非常深邃
  19. CISSP 考试知识要点总结
  20. MarioNETte: Few-shot Face Reenactment Preserving Identity of Unseen Targets(AAAI20)

热门文章

  1. linux nginx vue_Vue-CLI 3.x 部署项目至生产服务器
  2. php yii结果集合并,PHP 基础之数组合并
  3. eix安装_U盘安装原版Windows 8.1
  4. 如何不让tomcat在启动时弹窗_Tomcat 在 Spring Boot 中是如何启动的
  5. linux下如何运行脚本程序设计,Uboot 如何运行脚本
  6. 华为的mysql数据库如何登陆_怎么登陆mysql数据库
  7. w大师pdf转html转换器,W大师PDF转WORD
  8. 加拿大28历史开奖鸿蒙,本内特入选加拿大男篮集训名单,史上最水状元秀如今在何处?...
  9. python下载论文_Python实现一个论文下载器的过程
  10. php 删除 session 文件,如何删除php中的session文件