如何禁用recyclerview android内的复选框

时间:2017-06-29 04:37:29

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

我在循环视图中有复选框的列表/行。在我的情况下,用户只能选择3个复选框。一旦用户选择第三个复选框,我想禁用其他行中的其余复选框。

我正在捕捉onBindViewHolder类中的选择/取消选择复选框。

据我所知,我可以启用/禁用notifyDataSetChanged();类中的复选框。

但在我的情况下,我想在渲染后启用/禁用复选框。

我能想到的一种方法是,从Activity类中调用<script src="js/file.js"></script> <script> $("#center-button").click(function() { explodePage("center"); }); </script> ,然后重新渲染所有循环视图。

但我希望在适配器类本身内有更好的方法。

ps:我是android / java的新手。

3 个答案:

答案 0 :(得分:0)

notifyDataSetChanged()将无视您的情况。

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

从我的头脑中,一种方法是存储&#34;检查&#34;位置在适配器内的数组中,然后在onBindViewHolder()内检查是否应启用或禁用当前位置。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以使用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()作为最后的手段。