我在循环视图中有复选框的列表/行。在我的情况下,用户只能选择3个复选框。一旦用户选择第三个复选框,我想禁用其他行中的其余复选框。
我正在捕捉onBindViewHolder
类中的选择/取消选择复选框。
据我所知,我可以启用/禁用notifyDataSetChanged();
类中的复选框。
但在我的情况下,我想在渲染后启用/禁用复选框。
我能想到的一种方法是,从Activity类中调用<script src="js/file.js"></script>
<script>
$("#center-button").click(function() {
explodePage("center");
});
</script>
,然后重新渲染所有循环视图。
但我希望在适配器类本身内有更好的方法。
ps:我是android / java的新手。
答案 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()作为最后的手段。