禁用 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 的所有子视图的主要内容,如果未能解决你的问题,请参考以下文章

禁用整个RecyclerView的点击次数

如何禁用滚动视图子视图的点击手势?

将子视图添加到 UICollectionView - 禁用滚动

eowise 无法捕获 Sticky Header (RecyclerView) 的子视图的触摸事件

RecyclerView 在滚动时弄乱了子视图

更改recyclerview android的子视图颜色