4

カスタマイズしたCursorAdapterを使用してListViewを表示するアプリケーションがあります。カスタムCursorAdapter.bindView内に、チェックされた値(カーソルの列に基づく)を設定し、clickListenerを設定するCheckBoxオブジェクトがあります。これが私のコードです:

    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 に答える