CheckBox меняет значение дважды - PullRequest
7 голосов
/ 12 октября 2010

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

Этот флажок установлен по умолчанию.Если флажок снят, его следует удалить из списка.

Проблема заключается в том, что onCheckedChanged запускается дважды: когда я нажимаю на флажок, чтобы снять его (с isChecked false), а после удаленияitem (with 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;
}

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

Ответы [ 3 ]

6 голосов
/ 07 октября 2011

Я столкнулся с той же проблемой, похоже, это ошибка 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();

    }

}
3 голосов
/ 29 июля 2016

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

Код проблемы

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

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

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

Решение

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

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

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

0 голосов
/ 21 июня 2011

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

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

Маркировка испортила ситуацию, похоже на ошибку.

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

private OnCheckedChangeListener checkBoxitemClickListener = new OnCheckedChangeListener() {

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {


        if(isChecked)
        {               
            //do smth
        }else
        {
            //do smth
        }   

        buttonView.setTag(null);                        
    }
};

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

Приветствия

...