안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요. 이제 한 8개월째 접어드는 안드로이드 개발자 입니다.
오늘 버그를 하나 발견을 해서 수정을 하려는데 힘드네요.
중수, 고수님들은 아시겠지만 ListView에 setAdapter를 하여
한줄 한줄 CheckBox를 포함한 리스트를 구현을 하였는데. 체크를 한뒤에
스크롤로 Check된 라인이 가려졌다 다시 보여지게 되면 Check가 풀리는 현상이 있네요.
다시 초기화 되는건지.. 원..... 혹시 비슷한 경험이 있으신분들 방법 좀 알려주세요.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView == null){
LayoutInflater mLayoutinflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = mLayoutinflater.inflate(R.layout.actionlistitem, null);
}
final CheckBox checkbox = (CheckBox)convertView.findViewById(R.id.checkAction);
checkbox.setText(actionlist.get(position));
checkbox.setChecked(false);
checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton view, boolean isChecked) {
// TODO Auto-generated method stub
if(view.isChecked()){
Log.d(LOG_TAG, "checked list item is : " + String.valueOf(listnumber+1));
Log.d(LOG_TAG, "checked list name is : " + String.valueOf(view.getText()));
states[listnumber]=isChecked;
}
}
});
return convertView;
}
오늘 버그를 하나 발견을 해서 수정을 하려는데 힘드네요.
중수, 고수님들은 아시겠지만 ListView에 setAdapter를 하여
한줄 한줄 CheckBox를 포함한 리스트를 구현을 하였는데. 체크를 한뒤에
스크롤로 Check된 라인이 가려졌다 다시 보여지게 되면 Check가 풀리는 현상이 있네요.
다시 초기화 되는건지.. 원..... 혹시 비슷한 경험이 있으신분들 방법 좀 알려주세요.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView == null){
LayoutInflater mLayoutinflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = mLayoutinflater.inflate(R.layout.actionlistitem, null);
}
final CheckBox checkbox = (CheckBox)convertView.findViewById(R.id.checkAction);
checkbox.setText(actionlist.get(position));
checkbox.setChecked(false);
checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton view, boolean isChecked) {
// TODO Auto-generated method stub
if(view.isChecked()){
Log.d(LOG_TAG, "checked list item is : " + String.valueOf(listnumber+1));
Log.d(LOG_TAG, "checked list name is : " + String.valueOf(view.getText()));
states[listnumber]=isChecked;
}
}
});
return convertView;
}

2010.04.17 15:33:35
checkbox.setChecked(false);
이것을 getView의 포지션에 가져다가 사용하세요.
텍스트는 그렇게 처리하셨는데요. 체크도 그렇게 해야 하는것이 아닐가요?
이것을 getView의 포지션에 가져다가 사용하세요.
텍스트는 그렇게 처리하셨는데요. 체크도 그렇게 해야 하는것이 아닐가요?
2010.04.17 16:23:09
저도 이 문제 때문에 날밤새고 있는 사람중의 한명입니다;;
suppul// getView의 포지션에 가져다가 사용하라는게 어떤 뜻인지 자세한 설명좀 부탁드려도 될까요?ㅋ
2010.04.17 20:49:12
리스트뷰는 성능상의 이유로 convertView라는 개념을 이용하여, 뷰를 재사용하고 있습니다.
이런 이유로 체크 박스나 라이오버튼등을 그냥 set하시게 되면,
재사용되는 뷰로 인해 체크가 풀리던지 다른곳에 체크가 되는 현상이 발생하게 됩니다.
getview 부분에서 포지션, 즉 체크 되어야 할 놈의 위치를 기억하고 있는 "변하지" 않는 데이터를 이용하여
처리해야 합니다.
^^
2010.09.17 16:05:41
CheckBox check = (CheckBox) v.findViewById(R.id.check);
......................
check.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
...............................................................................................................................
});
if([position..]컨버전스님이 말하신 변하지 않는 데이터일 경우)
check.setChecked(true);
else
check.setChecked(false);
return v;
}
하니까 잘 됩니다.
휘유.. check.setChecked(boolean) 부분을 setOnCheckedChangeListener() 위에 넣고 했더니
동작이 완전 다르네요;
고생하셨습니다.;;;



