【问题标题】:How to disabling checkboxes inside recyclerview android如何在recyclerview android中禁用复选框
【发布时间】:2017-12-02 15:24:48
【问题描述】:

我在回收视图中有复选框列表/行。就我而言,用户只能从众多复选框中选择 3 个。一旦用户选择了第三个复选框,我想禁用不同行中的其余复选框。

我正在捕获adapter 类中的选择/取消选择复选框。

据我所知,我可以在onBindViewHolder 类中启用/禁用复选框。

但就我而言,我想在复选框被渲染后启用/禁用它们。

我能想到的一种方法是,从 Activity 类调用notifyDataSetChanged();,然后重新渲染所有回收的视图。

但我希望在适配器类本身内部有比这样做更好的方法。

ps:我是 android/java 新手。

【问题讨论】:

    标签: java android checkbox android-recyclerview android-arrayadapter


    【解决方案1】:

    您可以使用SparseBooleanArray记录每个项目根据其位置的所有更改。

    您可以在RecyclerView适配器中使用以下方法:

    notifyItemInserted(int)
    notifyItemRemoved(int)
    notifyItemRangeChanged(int, int)
    notifyItemRangeInserted(int, int)
    notifyItemRangeRemoved(int, int)
    

    RecyclerView.Adapter了解更多信息。

    仅使用notifyDataSetChanged() 作为最后的手段。因为调用 notifyDataSetChanged() 将强制视图重新绑定和重新布局。正如documentation 所说:

    void notifyDataSetChanged ()

    通知任何已注册的观察者数据集已更改。

    有两类不同的数据变化事件,项目变化 和结构变化。项目更改是指单个项目有其 数据已更新,但没有发生位置变化。结构 更改是在数据中插入、删除或移动项目时 设置。

    这个事件没有说明数据集发生了什么变化, 迫使任何观察者假设所有现有的项目和结构 可能不再有效。 LayoutManagers 将被强制完全重新绑定 并重新布局所有可见视图。

    RecyclerView 会尝试合成可见的结构变化 适配器报告它们具有稳定 ID 的事件 使用方法。这有助于动画和视觉的目的 对象持久性,但仍需要单独的项目视图 反弹并反弹。

    如果你正在编写一个适配器,它总是会更有效地使用 如果可以,更具体的更改事件。依靠 notifyDataSetChanged() 作为最后的手段。

    【讨论】:

      【解决方案2】:

      在您的模型类中,您可以有一个布尔变量来决定是否应该启用该项目,另一个布尔变量来跟踪检查状态,或者该项目是否被检查。在onBindViewHolder 中检查变量以启用或禁用项目。跟踪所选项目,然后在每次检查和取消选中后检查所选项目是否超过限制。然后遍历你的项目,然后检查项目是否被选中。如果未选中该项目,则将该值设置为 false 并在循环后发送 notifyDataSetChanged() 并在 onBindViewHolder() 中检查该值并启用或禁用该项目/复选框

      【讨论】:

        【解决方案3】:

        notifyDataSetChanged() 在您的情况下绝对有效。

        请注意,您不必从 Activity 调用此方法。 选中第三个复选框后,您可以在适配器内部调用它。

        在我看来,一种方法是将“检查”位置存储在适配器内的数组中,然后在 onBindViewHolder() 内检查是否应该启用或禁用当前位置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-10
          • 2022-09-23
          • 2013-01-19
          • 2014-07-11
          相关资源
          最近更新 更多