You need to enable JavaScript to run this app. 如何修改RecyclerView每一个子元素内的TextView的可见性状态
优惠活动
大模型
产品
解决方案
定价
更多

如何修改RecyclerView每一个子元素内的TextView的可见性状态

问题原因

你的代码存在两个核心问题:

  • Item数据类没有存储每个条目当前的显示语言状态,当前可见性是直接存在ViewHolder的View属性里的,而RecyclerView的View是复用的,你无法通过遍历数据源ItemList直接修改对应View的可见性
  • 你写的test_if_german方法里引用的text_view_de、text_view_en是全局的控件引用,只会匹配到页面里首个符合id的控件,所以只能改第一个条目的状态
修复方案

步骤1:修改Item数据类,新增显示状态字段

// 假设你原来的Item类结构如下,新增isShowGerman字段
data class Item(
    val id: UUID,
    val Englisch: String,
    val Deutsch: String,
    var isShowGerman: Boolean = true // 新增字段,默认显示德语
)

步骤2:修改Adapter的逻辑,和状态绑定

2.1 调整onBindViewHolder逻辑,根据状态设置可见性

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val currentItem = ArrList[position]
    holder.textViewDe.text = currentItem.Deutsch
    holder.textViewEn.text = currentItem.Englisch
    // 根据状态设置可见性
    if (currentItem.isShowGerman) {
        holder.textViewDe.visibility = View.VISIBLE
        holder.textViewEn.visibility = View.GONE
    } else {
        holder.textViewDe.visibility = View.GONE
        holder.textViewEn.visibility = View.VISIBLE
    }
}

2.2 调整ViewHolder的点击事件,同步修改数据状态

override fun onClick(p0: View?) {
    val currentItem = ArrList[adapterPosition]
    // 先改数据状态
    currentItem.isShowGerman = !currentItem.isShowGerman
    // 再刷新当前条目
    notifyItemChanged(adapterPosition)
}

步骤3:修改MainActivity的批量重置方法

fun resetAllToGerman() {
    // 所有条目设为显示德语
    ItemList.forEach { it.isShowGerman = true }
    adapter.notifyDataSetChanged()
}

fun resetAllToEnglish() {
    // 所有条目设为显示英语
    ItemList.forEach { it.isShowGerman = false }
    adapter.notifyDataSetChanged()
}

需要批量切换的时候直接调用上面两个方法即可,不需要再遍历修改View属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 18:57:03