点击Activity按钮实现RecyclerView条目显示与隐藏
问题与解决方案:RecyclerView切换显示全部/仅首项
问题概述
需求为:RecyclerView初始仅展示position=0的条目,点击"查看全部"按钮后显示所有条目,点击收起按钮回到仅显示首项。现有代码通过showAll变量控制,但逻辑存在问题导致功能异常。
现有代码问题分析
onBindViewHolder中,非showAll模式下所有ViewHolder都绑定list[0]的数据,导致视图复用混乱- 未处理展开/收起按钮的可见性切换,用户体验缺失
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
相关产品推荐
相关产品推荐

