Android CheckBox-Eliminar un setOnCheckedChangeListener previamente configurado
android-cursoradapter (2)
Tengo una aplicación que muestra un ListView utilizando un CursorAdapter que he personalizado. Dentro de mi CursorAdapter.bindView personalizado, tengo un objeto CheckBox que establezco el valor verificado (basado en una columna en el cursor) y configuro un clickListener. Aquí está mi código:
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();
}
});
El único problema es que cuando Android recicla mis vistas, el onCheckedChangeListener aún está activo y, por lo tanto, la llamada a setChecked () hace que ese código se ejecute en el oyente. Me gustaría saber cómo invalidar el onCheckedChangedListener justo antes de que se ejecute el código que he incluido.
Puede llamar a mcheckBox.setOnCheckedChangeListener(null);
si se realiza dentro de onCheckedChangeListener
, debe declarar mCheckBox
final
.
Puedes hacer algo como:
// 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();
}
});
Hay muchas optimizaciones que puede hacer con el código anterior. Acabo de ilustrar la lógica básica.