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

点击Activity按钮实现RecyclerView条目显示与隐藏

问题与解决方案:RecyclerView切换显示全部/仅首项

问题概述

需求为:RecyclerView初始仅展示position=0的条目,点击"查看全部"按钮后显示所有条目,点击收起按钮回到仅显示首项。现有代码通过showAll变量控制,但逻辑存在问题导致功能异常。

现有代码问题分析

  1. onBindViewHolder中,非showAll模式下所有ViewHolder都绑定list[0]的数据,导致视图复用混乱
  2. 未处理展开/收起按钮的可见性切换,用户体验缺失
  3. getItemCount始终返回完整列表长度,即使隐藏条目,RecyclerView仍会创建多余ViewHolder,浪费性能

修正后的完整代码

1. Adapter核心修正

通过showAll控制getItemCount返回值,替代隐藏条目的方式,更高效且逻辑清晰:

class Adapter(private var list: List<Model>) : RecyclerView.Adapter<Adapter.ViewHolder>() {

    var showAll: Boolean = false

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val textView: TextView = view.findViewById(R.id.textView)
    }

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.recyclerview_item, viewGroup, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
        val model = list[position]
        viewHolder.textView.text = model.textView
        // 无需手动控制visibility,getItemCount已控制显示条目数
    }

    // 关键:根据showAll返回对应条目数
    override fun getItemCount(): Int {
        return if (showAll) list.size else max(1, list.size) // 列表为空时返回0,否则返回1
    }

    fun updateShowState(showAll: Boolean) {
        this.showAll = showAll
        notifyDataSetChanged() // 通知RecyclerView刷新
    }

    // 更新数据集方法
    fun updateDataSet(newList: List<Model>) {
        this.list = newList
        notifyDataSetChanged()
    }
}

2. MainActivity逻辑修正

处理按钮点击,同步切换显示状态与按钮可见性:

private lateinit var adapter: Adapter
private lateinit var recyclerView: RecyclerView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    
    recyclerView = findViewById(R.id.recyclerView)
    // 示例数据,可替换为实际业务数据
    val dataList = listOf(Model("条目1"), Model("条目2"), Model("条目3"))
    adapter = Adapter(dataList)
    recyclerView.adapter = adapter
    recyclerView.layoutManager = LinearLayoutManager(this)

    val buttonPlus = findViewById<ImageView>(R.id.buttonPlus)
    val buttonMinus = findViewById<ImageView>(R.id.buttonMinus)

    buttonPlus.setOnClickListener {
        adapter.updateShowState(true)
        buttonPlus.visibility = View.GONE
        buttonMinus.visibility = View.VISIBLE
    }

    buttonMinus.setOnClickListener {
        adapter.updateShowState(false)
        buttonPlus.visibility = View.VISIBLE
        buttonMinus.visibility = View.GONE
    }
}

3. XML布局修正

原布局中title_tv的text属性未闭合,修正如下:

<TextView
    android:id="@+id/title_tv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center_horizontal"
    android:text="@string/title"/> <!-- 补上闭合引号 -->

方案说明

  • 相比隐藏条目,修改getItemCount的方式避免了不必要的ViewHolder创建,性能更优
  • onBindViewHolder逻辑简化,仅需正常绑定数据,降低出错概率
  • 同步切换按钮可见性,符合用户操作预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:07:04