Android CheckBox - Удаление ранее установленного OnCheckedChangeListener - PullRequest
4 голосов
/ 18 декабря 2011

У меня есть приложение, которое отображает ListView с помощью настроенного мной CursorAdapter. В моем собственном CursorAdapter.bindView у меня есть объект CheckBox, в котором я устанавливаю проверенное значение (на основе столбца на курсоре) и устанавливаю clickListener. Вот мой код:

    CheckBox mCheckBox = (CheckBox) view.findViewById(R.id.list_done);
    mCheckBox.setChecked(isDone);
    mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
                AW.getDB().updateTask(c.getInt(c.getColumnIndex(ToDoDBAdapter.KEY_ID)), isChecked);
                TD.displayTasks();
        }
    });

Единственная проблема состоит в том, что когда Android перезагружает мои представления, onCheckedChangeListener все еще активен, и, таким образом, вызов setChecked () вызывает выполнение кода в слушателе. Я хотел бы знать, как сделать недействительными данные onCheckedChangedListener непосредственно перед запуском кода, который я включил.

Ответы [ 2 ]

8 голосов
/ 18 декабря 2011

Вы можете позвонить mcheckBox.setOnCheckedChangeListener(null);, если это сделано внутри onCheckedChangeListener, вам нужно объявить mCheckBox final.

1 голос
/ 18 декабря 2011

Вы можете сделать что-то вроде:

// c is the Cursor you are getting
CheckBox mCheckBox = (CheckBox) view.findViewById(R.id.list_done);
mCheckBox.setTag(new Integer(c.getPosition());
mCheckBox.setChecked(isDone);
mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        Integer posInt = (Integer)buttonView.getTag();

        int pos = posInt.intValue();
        c.moveToPosition(pos);
            AW.getDB().updateTask(c.getInt(c.getColumnIndex(ToDoDBAdapter.KEY_ID)), isChecked);
            TD.displayTasks();
    }
});

Существует множество оптимизаций, которые вы можете сделать для приведенного выше кода. Я только что проиллюстрировал основную логику.

...