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
相关产品推荐
相关产品推荐

