【问题标题】: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() 内检查是否应该启用或禁用当前位置。