Android IndexOutOfBoundsException: Inconsistency detected.

news/2024/11/18 2:33:01/

问题

RecycleView下拉刷新时,滑倒列表出现了崩溃。
崩溃信息如下:

  UncaughtException detected: java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 5(offset:5).state:15 androidx.recyclerview.widget.RecyclerView{8623f12 VFE...... .F...... 0,0-1080,1713 #7f0a0c9b app:id/recyclerView}, adapter:com.app.pinealgland.exposure.MultiTypeExposureAdapter@af886e3, layout:com.app.pinealgland.ui.base.widgets.pull.layoutmanager.CustomLineaLayoutManagerEx@b7cc8e0, context:com.app.pinealgland.activity.MainActivity@6a72786at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6183)at androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:288)at androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:345)at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:361)at androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:368)at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:399)at android.os.Handler.handleCallback(Handler.java:793)at android.os.Handler.dispatchMessage(Handler.java:98)at android.os.Looper.loop(Looper.java:173)at android.app.ActivityThread.main(ActivityThread.java:6698)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782)

原因

下拉刷新时,我们一般会先clear()掉旧数据,重新请求后addAll()新数据,然后notifyDataSetChanged()刷新列表显示。

伪代码如下:

//下拉刷新
onRefresh(){list.clear(); //清除旧数据loadData(){//网络请求新数据,耗时任务//请求成功onSucceed{list.addAll(newData); //添加新数据adapter.notifyDataSetChanged(); //刷新列表}}
}

由于网络请求是耗时的,在这期间用户可能会滑动列表。

由于已经clear()列表中没有数据了,但是并没有立刻调用notifyDataSetChanged去通知列表,此时滑动列表依旧会使用旧数据渲染,就会出现混乱,进而报越界异常IndexOutOfBoundsException

解决方案

  1. clear后立马notifyDataSetChanged,列表立马会变成空白,用户无法滑动。
 list.clear(); //清除旧数据adapter.notifyDataSetChanged(); //立即刷新列表
  1. 等请求结束后再clear,addAll添加新数据后,掉notifyDataSetChanged一起刷新列表,这样即使用户滑动列表也不会出现数据混乱。
 //请求成功onSucceed{list.clear(); //清除旧数据list.addAll(newData); //添加新数据adapter.notifyDataSetChanged(); //一起刷新列表}

http://www.ppmy.cn/news/582723.html

相关文章

mysql 1273错误

错误描述 数据库进行数据传输时(将本地数据库导入到服务器数据库)时报1273错误:. [Err] [Dtf] 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci’ 然后尝试用先将之前数据库转存为SQL文件,再导入sql文件,继续报错 报…

LeetCode 1713 得到子序列的最少操作次数

LeetCode 1713 得到子序列的最少操作次数 题目链接 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素。 每一次操作中,你可以在 arr 的任意位置插入任一整数。比方说&#xff0c…

leetcode:1713. 得到子序列的最少操作次数【最长公共子序列优化 + 转化为最长递增子序列】

目录 题目截图题目分析ac code总结 题目截图 题目分析 就是要找最长公共子序列典型的就是m * n的dp,但会超时特别地,target不重复因此,可以构造target的v和i的映射遍历arr,得到target的下标顺序使用【经典最长递增子序列二分法】…

LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)

文章目录 1. 题目2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素。 每一次操作中,你可以在 arr 的任意位置插入任一整数。 比方说,如果 arr [1,4,…

ANR问题基本定位与分析

一、ANR类型 ANR,即“Application not responding”,在Android中,ManagerService会检测应用的响应时间,如果在约定时间内没有完成,那么系统就会判定应用ANR。 1、输入超时 05-28 11:25:00.420 ?1668 ?1713 E Acti…

力扣LeetCode-1713. 得到子序列的最少操作次数-题解-最长递增子序列

目录 力扣LeetCode-1713. 得到子序列的最少操作次数Problem DescriptionTipsSample ISample II 解题思路AC代码 力扣LeetCode-1713. 得到子序列的最少操作次数 传送门 Problem Description 给你一个数组 t a r g e t target target ,包含若干 互不相同 的整数&a…

Shell:查看进程与对应的线程

1.通过:ps -efL | grep 进程ID或名字 UID PID PPID LWP C NLWP STIME TTY TIME CMD user 228298 201990 228298 0 2 00:14 pts/0 00:00:00 ./t_thread user 228298 201990 228299 0 2 00:14 pts/0 …

【TS】1713- 一看就懂的TypeScript工具类型

TypeScript是一种静态类型检查的编程语言,它内置了许多基本数据类型,如字符串、数字和布尔型等。除了基本数据类型,当某种类型对于大多数代码来说都非常有用时,它们就会被添加到TypeScript中并且被大家使用而无需担心它们的可用性…