You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:25:17