如何修改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
相关产品推荐
相关产品推荐

