4

我有一个使用我自定义的 CursorAdapter 显示 ListView 的应用程序。在我的自定义 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 无效。

4

2 回答 2

11

可以调用mcheckBox.setOnCheckedChangeListener(null);,如果是里面做的onCheckedChangeListener,需要声明mCheckBox final

于 2011-12-18T01:37:40.670 回答
1

您可以执行以下操作:

// 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();
    }
});

您可以对上述代码进行许多优化。我只是说明了基本逻辑。

于 2011-12-18T01:52:11.250 回答