禁用 RecyclerView 的所有子视图
Posted
技术标签:
【中文标题】禁用 RecyclerView 的所有子视图【英文标题】:Disable all subviews of RecyclerView 【发布时间】:2021-11-20 20:25:48 【问题描述】:我在 Fragment 中使用 RecyclerView 来显示元素列表,每个元素都包含一个复选框,如下所示。
单击START
按钮后,我想禁用 RecyclerView 中的所有元素。
这是我的代码:
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
startButton = view.findViewById<Button>(R.id.start_button)
startButton.setOnClickListener
// yes, recyclerView is defined
setViewGroupEnabled(recyclerView, false)
fun setViewGroupEnabled(view: ViewGroup, enabled: Boolean)
Log.d(TAG, "Numkids: $view.childCount")
view.isEnabled = enabled
for (v in view.children)
if (v is ViewGroup) setViewGroupEnabled(v, enabled)
else v.isEnabled = enabled
这段代码禁用了recyclerView
中的大部分 元素,但由于某种原因,它跳过了一些,通常一次跳过多个。它似乎也会以一种模式跳过子视图,这种模式会根据我滚动列表的距离而有所不同。
为什么它的行为如此奇怪?
【问题讨论】:
【参考方案1】:RecyclerView 有一个适配器。它的工作是处理 RecyclerView 的每一项的布局。这包括禁用项目。
给你的适配器添加一个类参数:
private var disabled = false
向您的适配器添加方法:
fun setDisabled(disabled: Boolean)
this.disabled = disabled
notifyDatasetChanged()
在您的 onBindViewHolder 方法中,检查 disabled 参数并根据需要禁用视图:
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
if (this.disabled)
//disable you view, by disabling whichever subview you want
else
// The normal non disabled flow (what you have now)
现在在单击按钮时调用 setDisabled(true):
startButton.setOnClickListener
// yes, recyclerView is defined
adapter.setDisabled(true)
并调用 setDisabled(false) 以重新启用项目。
【讨论】:
谢谢!关键是notifyDatasetChanged()
函数,它触发了对 onBindViewHolder
的调用,然后我可以根据需要更新我的视图。
@gioravered 我有一个类似的用例。如何访问视图和子视图以在 onBindViewHolder() 方法中禁用它们?
你可以使用 holder.itemView.findViewById(R.id.your_subview_id)以上是关于禁用 RecyclerView 的所有子视图的主要内容,如果未能解决你的问题,请参考以下文章
将子视图添加到 UICollectionView - 禁用滚动