【问题标题】:Disable all subviews of RecyclerView禁用 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 中的大部分 元素,但由于某种原因,它跳过了一些,通常一次跳过多个。它似乎也会以一种模式跳过子视图,这种模式会根据我滚动列表的距离而有所不同。

为什么它的行为如此奇怪?

【问题讨论】:

    标签: android android-studio android-fragments android-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)
    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    相关资源
    最近更新 更多