2011-12-18 3 views
4

사용자 정의한 CursorAdapter를 사용하여 ListView를 표시하는 애플리케이션이 있습니다. 내 사용자 지정 CursorAdapter.bindView 내에서 (커서의 열을 기준으로) 확인 된 값을 설정하고 clickListener를 설정하는 CheckBox 개체가 있습니다. 여기 내 코드는 다음과 같습니다Android CheckBox - 이전에 setOnCheckedChangeListener 제거

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

유일한 문제는 안드로이드 내 견해를 재활용 할 때 onCheckedChangeListener이 여전히 활성화되어 있는지, 따라서 setChecked에 대한 호출은() 리스너 내에서 그 코드가 실행됩니다. 내가 포함 된 코드를 실행하기 전에 바로 invalidata에 onCheckedChangedListener를 알고 싶습니다. 그것이 onCheckedChangeListener 내부에서 수행되는 경우가 mcheckBox.setOnCheckedChangeListener(null);를 호출 할 수 있습니다

답변

1

당신이 뭔가를 할 수 있습니다. 방금 기본 논리를 설명했습니다.

+0

우수 답변 및 실수로 내 다른 질문에 답하는 +1 : http://stackoverflow.com/questions/8549386/mcheckbox-setoncheckedchangelistener-within-cursoradapter – finiteloop

8

, 당신은 finalmCheckBox를 선언해야합니다.

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

당신이 위의 코드로 할 수있는 최적화가 많이 있습니다