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

Kotlin中RecyclerView点击项时隐藏其他项指定布局实现方法

解决方案

要实现点击RecyclerView项时,仅保持当前项的addsLayout切换显示、其他项全部隐藏的效果,你需要在Adapter中维护当前展开项的位置,而非使用单个布尔变量b(单个变量会因RecyclerView的复用机制导致状态混乱)。具体实现如下:

1. 在Adapter中添加状态变量

在你的RecyclerView Adapter类里,新增一个变量记录当前展开的item位置:

class YourAdapter(private val dataList: List<YourDataModel>) : RecyclerView.Adapter<MyViewHolder>() {
    // 记录当前展开的item位置,-1表示无项展开
    private var expandedPosition = -1

    // ... 原有代码(如onCreateViewHolder等)
}

2. 修改点击事件逻辑

更新mainLayout的点击事件,点击时更新展开位置并刷新列表:

holder.mainLayout.setOnClickListener {
    val currentPosition = adapterPosition
    expandedPosition = if (expandedPosition == currentPosition) {
        // 当前项已展开,点击后关闭
        -1
    } else {
        // 展开当前项,自动关闭其他项
        currentPosition
    }
    // 刷新列表以更新所有item的状态
    notifyDataSetChanged()
}

3. 在onBindViewHolder中控制布局显示

在onBindViewHolder里,根据当前位置是否为展开位置,设置addsLayout的可见性,同时适配你需要的if (!b)逻辑:

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    // 绑定数据到itemTitle等视图...

    val isExpanded = expandedPosition == position
    holder.addsLayout.isVisible = isExpanded

    // 替换你原有的if(!b)逻辑,这里的isExpanded对应原来的b变量
    if (!isExpanded) {
        // 非展开状态下的执行逻辑
    } else {
        // 展开状态下的执行逻辑
    }
}

4. 优化刷新性能(可选)

如果觉得notifyDataSetChanged()刷新整个列表性能不佳,可以改用notifyItemChanged()分别刷新之前展开的项和当前点击的项:

holder.mainLayout.setOnClickListener {
    val previousPosition = expandedPosition
    val currentPosition = adapterPosition
    expandedPosition = if (expandedPosition == currentPosition) -1 else currentPosition
    
    // 刷新之前展开的项(若存在)
    if (previousPosition != -1) {
        notifyItemChanged(previousPosition)
    }
    // 刷新当前点击的项
    notifyItemChanged(currentPosition)
}

原代码的问题说明

你原来用单个布尔变量b的方式存在两个核心问题:

  • RecyclerView的item复用机制会导致滚动时状态错乱,多个item会共用同一个b变量的状态
  • 无法精准控制其他item的addsLayout隐藏,单个变量只能记录全局状态,无法区分不同item的位置

内容的提问来源于stack exchange,提问作者Dioo B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:40:24