移除ArrayList元素触发IndexOutOfBoundsException问题求助
问题解答
1. 数组下标越界异常的原因
- position与当前列表长度不匹配:Adapter传递的
position基于点击时绑定的数据集长度,但执行移除操作时,userDataList的长度可能已小于该position值。比如日志显示列表实际只有2个元素,但点击传递的position是5,这说明Adapter数据源和userDataList已不同步,或多次移除操作导致列表缩短后,Adapter未及时更新,传递了无效position。 - 多列表操作不同步:你同时维护
countChatList、imageList、userDataList三个列表,但移除操作仅在countChatList.contains(id)时触发,若三个列表元素数量未严格对应,会导致后续基于position操作userDataList时出现下标错误。 - 判断条件无效:用
userDataList.size > 1作为移除前提,这个条件和position是否有效无关——即使列表长度大于1,position仍可能超出当前列表的索引范围。
2. 对象显示为哈希码形式的原因
因为UserDataClass没有重写toString()方法。Kotlin/Java中所有类默认继承自Object,Object的toString()方法返回格式为类全名@十六进制哈希码,直接打印列表时,每个元素就会显示成这种形式。
3. 正确移除元素的解决方案
方案1:通过ID定位元素,避免依赖position
position会因列表变化失效,建议通过id查找userDataList中对应元素再移除:
if (countChatList.contains(id)) { countChatList.remove(id) imageList.remove(image) // 通过id定位目标元素 val targetUser = userDataList.firstOrNull { it.id == id } targetUser?.let { userDataList.remove(it) } // 通知Adapter更新数据 adapter.notifyDataSetChanged() }
方案2:统一维护单一数据源
将id、image、userData的信息封装到一个数据类中,只维护一个列表,彻底避免多列表同步问题:
// 封装后的单一数据类 data class ChatItem( val id: String, val image: String?, val userData: UserDataClass ) // 替换原来的三个列表 val chatItemList = mutableListOf<ChatItem>()
方案3:重写UserDataClass的toString()方法
在UserDataClass中添加toString()方法,方便日志查看对象实际内容:
class UserDataClass { var id: String? = null var picture: String? = null var username: String? = null var name: String? = null override fun toString(): String { return "UserDataClass(id=$id, username=$username, name=$name)" } }
方案4:确保Adapter与数据源同步
每次修改userDataList后,必须调用Adapter的notifyDataSetChanged()或更精确的通知方法(如notifyItemRemoved(index)),让Adapter更新UI,避免后续点击传递无效position。
内容的提问来源于stack exchange,提问作者Prateek Sharma
相关产品推荐
相关产品推荐

