본문 바로가기

PROGRAMING/Android

listView에서 checkbox 넣을 경우. 뷰 재사용 때문에 발생되는 문제 수정.

삭제할 음악 파일을 listvew에 CheckBox를 넣어  체크된 항목들을 삭제하도록 하려고 하였다.

CheckBox가 true가 될때 Map 담아 후에 삭제 항목을 클릭시  삭제되도록 한다.


뷰 재 사용으로 인해 체크 하지 않았던 항목도 체크 된 것 처럼 나타났다.

Map의 값을 읽어 CheckBox를 초기화 시켰다. 


holder.cbId.setOnCheckedChangeListener(new OnCheckedChangeListener() {

Map에 데이터를 넣을 때 위 OnCheckedChangeListener 을 사용하려고 하였으나 

최초 Map에서 데이터를 읽어와 CheckBox를 초기화할때도 해당 Listener가 연결되어 문제가 되었다.


그래서 아래와 같이 OnClickListener를 사용하여 Map에 데이터를 채워 넣었다.


String checked  = mCheckBoxHasMap.get(id);

LOG.i(CLASSNAME, "checked is "+checked);

if(checked!=null) {

LOG.i(CLASSNAME, "checked is not null");

holder.cbId.setChecked(Boolean.parseBoolean(checked));

} else {

LOG.i(CLASSNAME, "checked is null");

holder.cbId.setChecked(false);

}

holder.cbId.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

CheckBox cb = (CheckBox)v;

if(cb.isChecked()==true){

LOG.i(CLASSNAME, "mCheckBoxHasMap.put( id : "+id+",true)");

mCheckBoxHasMap.put(id, "true");

} else {

mCheckBoxHasMap.remove(id);

}

}

});


위와 같이 초기화 하고 onClickListener에서 Map에 체크된 데이터를 넣으면 문제가 없이 동작했다.