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

Kotlin如何遍历对象类型ArrayList 解决前后遍历逻辑异常问题

核心问题定位

你现有代码存在两个直接导致功能异常的问题:

  • 边界判断逻辑无效:id == id - 1 || id == id + 1 是恒不成立的条件,整数运算下任意值减1、加1的结果都不可能和原值相等,这个分支永远不会触发,直接导致你预期的「边界场景隐藏提示」逻辑完全不生效。
  • 遍历逻辑缺失:你仅获取了当前节目在列表中的索引,没有实现正向/反向遍历相邻元素的逻辑,也没有覆盖列表尾部的边界场景,同时缺少对列表为空、当前元素不在列表内(indexOf返回-1)的异常场景兜底,还滥用非空断言!!存在崩溃风险。
修复实现代码

以下是补全合法性校验、首尾边界处理、双向遍历逻辑的完整实现:

private fun handleLivePopUp() {
    val programList = presenter.programItems
    // 空列表兜底:统一隐藏所有提示
    if (programList.isNullOrEmpty()) {
        binding.playerController.startOverImg.setImageDrawable(
            ContextCompat.getDrawable(this, R.drawable.ic_startover)
        )
        binding.playerController.startOverToast.visibility = View.GONE
        binding.playerController.startOverLiveToast.visibility = View.GONE
        return
    }

    val currentIndex = programList.indexOf(presenter.currentProgram)
    // 当前节目不在列表内的异常场景兜底
    if (currentIndex == -1) {
        binding.playerController.startOverToast.visibility = View.GONE
        binding.playerController.startOverLiveToast.visibility = View.GONE
        return
    }

    val listSize = programList.size
    // 正向遍历取下一个相邻元素:如果是循环列表场景,尾元素的下一个指向首元素
    val nextProgram = if (currentIndex == listSize - 1) {
        programList[0]
    } else {
        programList[currentIndex + 1]
    }
    // 反向遍历取上一个相邻元素:如果是循环列表场景,首元素的上一个指向尾元素
    val previousProgram = if (currentIndex == 0) {
        programList[listSize - 1]
    } else {
        programList[currentIndex - 1]
    }

    // 统一设置功能图标
    binding.playerController.startOverImg.setImageDrawable(
        ContextCompat.getDrawable(this, R.drawable.ic_startover)
    )

    when {
        // 首元素场景:展示直播提示,隐藏重播提示
        currentIndex == 0 -> {
            binding.playerController.startOverToast.visibility = View.GONE
            binding.playerController.startOverLiveToast.visibility = View.VISIBLE
        }
        // 尾元素边界场景:隐藏所有提示
        currentIndex == listSize - 1 -> {
            binding.playerController.startOverLiveToast.visibility = View.GONE
            binding.playerController.startOverToast.visibility = View.GONE
        }
        // 列表中间元素场景:可根据业务需求调整提示展示规则
        else -> {
            binding.playerController.startOverLiveToast.visibility = View.GONE
            binding.playerController.startOverToast.visibility = View.VISIBLE
        }
    }
}
实现说明
  • 如果你的业务不需要循环首尾衔接的遍历逻辑,直接删除首尾跳转的代码,在边界位置拦截滑动操作即可。
  • 如果需要用迭代器实现遍历,直接调用programList.listIterator(currentIndex)即可从当前位置启动迭代:调用hasNext()/next()实现正向遍历,调用hasPrevious()/previous()实现反向遍历,比手动计算索引的出错概率更低。

内容的提问来源于stack exchange,提问作者ACTOR Afrique Centrale Terre d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:27:27