안드로이드 개발 질문/답변
(글 수 45,052)
현재 상황은 리스트뷰 사용시 제가 정의한 어댑터를 사용 중이고, 어댑터는 BaseAdapter 를 상속받고 있습니다.
getView 메서드에서는 setOnCheckedChangeListener 를 정의하였고, 해당하는 체크박스에 리스너를 걸었습니다.
그리고 리스너에는 notifyDataSetChanged() 를 사용하는 부분이 있습니다.
이러한 상황에서 실행시, 리스트 뷰의 체크를 변경하면 리스트뷰의 체크가 변경되면서 리스너를 실행시키고,
그 리스너에서는 notifyDataSetChanged 메서드를 실행시킵니다. 여기서 문제가 있는데요.
notifyDataSetChanged 메서드가 실행되면서 전혀 무관한 position 의 아이템의 리스너가 실행이 됩니다.
실행이 되면서 해당 체크로 분기하는 로직을 그대로 타버립니다.
예를 들면 0 ~ 6 번까지 인덱스가 있다면,
6번 아이템 내부의 값을 변경한 후 0번 인덱스의 체크를 변경하면 6번 아이템에서 OnCheckedChangeListener 가 실행되버려서
해당하는 로직을 탄 후 값이 변경되는 현상입니다. 그 6번이 체크가 변경이 안된 상황인데도 체크리스너가 실행이 되는 상황
입니다. (참고로 꼭 0 번과 6번이 아니라 여러번 해보면 2 번 3번 , 1번 5번, ... 해서 딱 두개의 아이템만이 연결된 듯 움직입니다)
이 0번과 6번이 무슨 관계가 있는 건 아닐건데 0번 아이템에서 체크를 변경한 후 실행되는 notifyDataSetChanged () 에 의해
6번에서 OnCheckedChangeListener 가 실행되는 것은 도대체 원인을 짐작하기 힘드네요.
안드로이드의 리스트뷰는 쉽게 쓰면 참 쉽고, 어렵게 쓰려면 한없이 어려워지는 것 같습니다. 참 리스트뷰 땜시 골치가 아프네요 ;;;;
위의 문제와 비슷한 경험을 해보셨던 분이나 원인이 짐작 가시는 분들의 조언을 구하고 싶습니다.
글을 장황하게 작성해서 혹 읽기 힘드실까 걱정되네요 ...
함 돠주십쇼~~
getView 메서드에서는 setOnCheckedChangeListener 를 정의하였고, 해당하는 체크박스에 리스너를 걸었습니다.
그리고 리스너에는 notifyDataSetChanged() 를 사용하는 부분이 있습니다.
이러한 상황에서 실행시, 리스트 뷰의 체크를 변경하면 리스트뷰의 체크가 변경되면서 리스너를 실행시키고,
그 리스너에서는 notifyDataSetChanged 메서드를 실행시킵니다. 여기서 문제가 있는데요.
notifyDataSetChanged 메서드가 실행되면서 전혀 무관한 position 의 아이템의 리스너가 실행이 됩니다.
실행이 되면서 해당 체크로 분기하는 로직을 그대로 타버립니다.
예를 들면 0 ~ 6 번까지 인덱스가 있다면,
6번 아이템 내부의 값을 변경한 후 0번 인덱스의 체크를 변경하면 6번 아이템에서 OnCheckedChangeListener 가 실행되버려서
해당하는 로직을 탄 후 값이 변경되는 현상입니다. 그 6번이 체크가 변경이 안된 상황인데도 체크리스너가 실행이 되는 상황
입니다. (참고로 꼭 0 번과 6번이 아니라 여러번 해보면 2 번 3번 , 1번 5번, ... 해서 딱 두개의 아이템만이 연결된 듯 움직입니다)
이 0번과 6번이 무슨 관계가 있는 건 아닐건데 0번 아이템에서 체크를 변경한 후 실행되는 notifyDataSetChanged () 에 의해
6번에서 OnCheckedChangeListener 가 실행되는 것은 도대체 원인을 짐작하기 힘드네요.
안드로이드의 리스트뷰는 쉽게 쓰면 참 쉽고, 어렵게 쓰려면 한없이 어려워지는 것 같습니다. 참 리스트뷰 땜시 골치가 아프네요 ;;;;
위의 문제와 비슷한 경험을 해보셨던 분이나 원인이 짐작 가시는 분들의 조언을 구하고 싶습니다.
글을 장황하게 작성해서 혹 읽기 힘드실까 걱정되네요 ...
함 돠주십쇼~~
안드로이드 캐발자 인사드리옵니다
잘 부탁드려요~




아마도 getView 에서 setChecked 를 콜을 하신게 아니신지 아마도 그것으로 인하여 리스너가 동작한듯 보여집니다
그러한 문제에 직면할 경우 저같은 경우는 setChecked 를 콜하기전에
setOnCheckedChangeListener(null) 한번 콜하여 리스너를 클리어 시키는 방법으로 문제를 해결하였습니다.
그리고 setChecked 호출후 다시 리스너 등록
도움이 되시길 바랍니다 수고하세요