Android卡片视图如何限制用户最多选择5个选项?
Android卡片视图Adapter实现最多选择5张卡片的正确方案
需求:实现卡片视图Adapter,卡片选中时切换颜色,限制用户最多选择5张卡片,超出后无法继续选择新卡片。
初始代码
@Override public void onBindViewHolder(final OptionsViewHolder holder, int position) { final OptionModel option = Options.get(position); holder.OptionName.setText(option.getName()); holder.iv_card.setColorFilter(option.isSelected() ? holder.item_view.getResources().getColor(R.color.Yellow) : holder.item_view.getResources().getColor(R.color.Dark_Blue)); if (!Disabled) { holder.iv_card.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { option.setSelected(!option.isSelected()); holder.iv_card.setColorFilter(option.isSelected() ? view.getResources().getColor(R.color.Yellow) : view.getResources().getColor(R.color.Dark_Blue)); } }); } else { holder.iv_card.setOnClickListener(null); } }
问题代码片段(更新后)
if (isSelected <= 4 || option.isSelected()) { if (!option.isSelected()) { option.setSelected(!option.isSelected()); holder.iv_card.setColorFilter(view.getResources().getColor(R.color.Yellow)); isSelected++; } else { option.setSelected(!option.isSelected()); holder.iv_card.setColorFilter(view.getResources().getColor(R.color.Dark_Blue)); isSelected--; } }
正确实现方案
上述更新代码的核心问题是使用了局部的isSelected计数变量,会因ViewHolder复用、数据更新导致计数与实际选中状态不一致。下面是修正后的完整实现:
@Override public void onBindViewHolder(final OptionsViewHolder holder, int position) { final OptionModel option = Options.get(position); // 初始化卡片颜色 int cardColor = option.isSelected() ? ContextCompat.getColor(holder.item_view.getContext(), R.color.Yellow) : ContextCompat.getColor(holder.item_view.getContext(), R.color.Dark_Blue); holder.iv_card.setColorFilter(cardColor); holder.OptionName.setText(option.getName()); if (!Disabled) { holder.iv_card.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 实时统计已选中的卡片数量 int selectedCount = 0; for (OptionModel item : Options) { if (item.isSelected()) { selectedCount++; } } if (option.isSelected()) { // 当前卡片已选中,执行取消选中操作 option.setSelected(false); holder.iv_card.setColorFilter(ContextCompat.getColor(view.getContext(), R.color.Dark_Blue)); } else { // 当前卡片未选中,判断是否已达最大选择数 if (selectedCount >= 5) { // 提示用户已选满 Toast.makeText(view.getContext(), "最多只能选择5张卡片", Toast.LENGTH_SHORT).show(); return; } // 执行选中操作 option.setSelected(true); holder.iv_card.setColorFilter(ContextCompat.getColor(view.getContext(), R.color.Yellow)); } // 局部刷新当前Item,避免全量刷新 notifyItemChanged(holder.getAdapterPosition()); } }); } else { holder.iv_card.setOnClickListener(null); } }
关键优化点
- 实时统计选中数量:每次点击时遍历列表统计已选中卡片,避免局部计数变量导致的状态不一致问题
- 用户体验优化:选满5张后点击未选中卡片,弹出Toast提示用户无法继续选择
- 适配API版本:使用
ContextCompat.getColor()替代getResources().getColor(),兼容Android 6.0及以上版本 - 局部刷新:使用
notifyItemChanged(holder.getAdapterPosition())刷新当前Item,提升性能
内容的提问来源于stack exchange,提问作者Abm
相关产品推荐
相关产品推荐

