getActivity / AndroidProject-Kotlin

Android 技术中台 Kotlin 版本,但愿人长久,搬砖不再有
Apache License 2.0
1.35k stars 242 forks source link

notifyItemRemoved导致的数组下标越界问题 #25

Closed clbDream closed 2 years ago

clbDream commented 2 years ago

【警告:请务必按照 issue 模板填写,不要抱有侥幸心理,一旦发现 issue 没有按照模板认真填写,一律直接关闭】

问题描述

请回答

其他

根据网上的文章,我在基类中做了部分调整,目前没有问题 image

getActivity commented 2 years ago

复现视频:VID_20221027.mp4.zip

getActivity commented 2 years ago

小伙子,根据你提供的复现步骤,我这边测试了一下,延迟 5 秒后删除了列表倒数第二条数据,然后不断点击最后一条 itemView,并没有复现到你所说的这个问题。

clbDream commented 2 years ago

你这个复现步骤不对,我上传了视频

clbDream commented 2 years ago

20221029_180626.zip 应该是position没有刷新的问题

getActivity commented 2 years ago

小伙子,看了你的视频,我认为我的复现步骤和你的视频中没有什么不同,都是删除最后第二个条目,然后点击最后第一个条目,但是我的不会出现你说的那种情况。

getActivity commented 2 years ago

劳烦小伙子,下载一份 AndroidProject-Kotlin 的源码,并修改源码成能够复现这个问题的,然后重新打包上传到 issue 评论区中来,我这边来进行验证。

clbDream commented 2 years ago

image 主要是这里,因为你测试的时候只是toast position,并没有获取具体数据,所以没有出现索引越界

clbDream commented 2 years ago

20221031_160329.zip 我简单写了一下,长按删除

clbDream commented 2 years ago

复现代码 AndroidProject-Kotlin - 副本.zip

getActivity commented 2 years ago
image
getActivity commented 2 years ago
image
getActivity commented 2 years ago

小伙子,我用第一张图片就会出现你说的那个问题,但是用第二种就不会,但是第一种方式是你自己搞出来的,你确定这个不是自己的问题?

clbDream commented 2 years ago

那就是不能再adapter内部remove?

getActivity commented 2 years ago

小伙子,问题的根本原因是,你直接在 ViewHolder 中拿 itemView 设置的点击监听,你拿 onBindView 的 position 位置是不准确的,因为你在 removeItem 的时候,这个方法调用的是 notifyItemRemoved 方法,该方法不会触发其他的 ViewHolder 重新绑定数据,导致当前条目设置监听的时候还是用之前的位置,你再点击就直接报错了。