안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
ListView를 사용자 레이아웃을 이용해 사용하고 있고, 해당 레이아웃에 버튼이 있습니다.
getView()함수에서 버튼에 대한 Listener를 등록하고,
해당 버튼을 누르니 버튼에 대한 Listener가 아니 글쎄.. 가끔 다른쪽 버튼 Listener로 동작하고 있습니다.
그게 항상 그런 것 아니고, 가끔 그러한 현상이 발생하는데요.
정말 뭥미 입니다..ㅠㅠ
소스코드는 부득이 하게 보여드릴 순 없지만.. 혹시 감잡히는 문제라도 없을까요..?
2010.05.11 22:01:54
notifyDataSetChanged() 요 함수를 쓰고 나서 문제가 일어나는 거 같습니다.
음.. 다운로드 상태를 Item에 표시하기 때문에 급격하게 notifyDataSetChanged() 요 함수를 호출하고 있는데요.
이 때문에 위 현상이 발생한 거 같기도 한데요..;; 우째해야 될까요;;
음.. 다운로드 상태를 Item에 표시하기 때문에 급격하게 notifyDataSetChanged() 요 함수를 호출하고 있는데요.
이 때문에 위 현상이 발생한 거 같기도 한데요..;; 우째해야 될까요;;
2010.05.11 22:32:09
조금만 생각해보시면 당연한 겁니다.
notifyDataSetChanged()가 호출되면 List Adapter에는 getView가 재호출됩니다. getCount 의 숫자만큼요.
여기에서 getView가 호출되었을때, 파라미터의 View가 null인가 여부에 따라서 View를 생성하거나 재사용합니다.
따라서 이 View안에 들어가있는 자식뷰들이 이벤트를 받고 있다면, View의 재사용 여부와 관계 없이 모두 재설정 해주어야 합니다.
2010.05.11 22:46:03
예, ㅠㅠ 저도 그래서 모두 재설정 해줘서 사용하고 있거든요..;;
아래 형식으로 재사용 여부의 관계없이 설정해주고 있는데도 그러합니다.
이게.. 행상 다른 리스너로 되는것도 아니고 다시 버튼을 클릭하면 원래 리스너로 동작하는 경우도 있습니다.
하지만 결코 해당 Item의 데이터가 잘못 등록 된 건 아닌거 같구요.
if( item.mBtnListener != null )
btn.setOnClickListener( item.mBtnListener );
else
{
MyListBtnListener btnListener = new MyListBtnListener();
btn.setOnClickListener( btnListener );
item.mBtnListener = btnListener;
}
아래 형식으로 재사용 여부의 관계없이 설정해주고 있는데도 그러합니다.
이게.. 행상 다른 리스너로 되는것도 아니고 다시 버튼을 클릭하면 원래 리스너로 동작하는 경우도 있습니다.
하지만 결코 해당 Item의 데이터가 잘못 등록 된 건 아닌거 같구요.
if( item.mBtnListener != null )
btn.setOnClickListener( item.mBtnListener );
else
{
MyListBtnListener btnListener = new MyListBtnListener();
btn.setOnClickListener( btnListener );
item.mBtnListener = btnListener;
}
디버깅 상태에서 확인하면 getView()에서 각 Item에 대해 한번의 버튼 리스터가 등록 되고 있습니다.ㅜㅜ