CheckBox дважды меняет значение

У меня есть Android ListView чьи элементы имеют флажок.

По умолчанию флажок установлен. После снятия флажка он должен быть удален из списка.

Проблема в том, что onCheckedChanged запускается дважды: когда я устанавливаю флажок, чтобы снять флажок (с isChecked false ) и после удаления элемента (с isChecked true ).

Это соответствующий код моего ArrayAdapter:

 public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.item, parent, false); holder = new ViewHolder(); holder.check = (CheckBox) convertView.findViewById(R.id.check); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final Object item = this.getItem(position); holder.check.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (!isChecked) { remove(item); // This somehow calls onCheckedChanged again } } }); return convertView; } 

Что я делаю не так?

Я столкнулся с той же проблемой, кажется, это ошибка Android, которая дважды выполняет метод onCheckChanged.

Мое решение: реализовать onClickListener , а не onCheckedChangedListener .

Что-то вроде этого:

 private final class CheckUpdateListener implements OnClickListener { private Group parent; private boolean isChecked; private CheckUpdateListener(Group parent) { this.parent = parent; } @Override public void onClick(View box) { this.isChecked = !parent.isChecked(); parent.setChecked(isChecked); notifyDataSetChanged(); } } 

У меня была аналогичная проблема, и я просто решил ее правильно, не избегая использования предполагаемого OnCheckedChangeListener .

Код проблемы

 holder.someCheckBox.setChecked(false); holder.someCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { ... } }); 

Примечание. Я установил статус проверки перед тем, как установить слушателя, чтобы предотвратить прослушивание слушателя при создании.

Но слушатель начал стрелять в on-check-событие ровно дважды только после того, как адаптер был вынужден заново создать или с помощью notifyDataSetChanged .

Решение

Очистите слушателя перед установкой состояния проверки, даже во время создания здесь.

 holder.someCheckBox.setOnCheckedChangeListener(null); holder.someCheckBox.setChecked(false); holder.someCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { ... } }); 

Теперь любые остаточные слушатели не будут запущены при установке начального значения флажка.

Я сталкиваюсь с той же проблемой.

После некоторых исследований выяснилось, что в RadioGroup существует аналогичное поведение для setCheckChangeListener.

Пометка вещей бесполезно, кажется ошибкой.

Мое обходное решение заключалось в установке тега в нуль в конце слушателя. Это сработало для меня.

 private OnCheckedChangeListener checkBoxitemClickListener = new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked) { //do smth }else { //do smth } buttonView.setTag(null); } }; 

Если вам нужно обновить ListView после, не забудьте вызвать «notifyDataSetChanged» на вашем адаптере.

ура