listView 질문드립니다.

조회수 1244회

Listview item에는 라디오버튼이미지가 있습니다. 최초에 Listview가 떴을 때 하나의 item에 라디오버튼이 체크되어있습니다. 그 이후 최초 선택된 라디오버튼을 제외한 나머지 item의 라디오버튼을 누르면 처음 선택된 라디오버튼은 사라지고 새로 선택한 라디오버튼에 체크를 하고 싶습니다. 해당코드는 이렇습니다.

publc void setRbImage(int location, int resId) {
    Drawable dr = getResoures().getDrawable(resId);
    mListData.get(location).mSelect = drawable;
    listAdapter.notifyDataSetChanged();
}

public void onItemClick(Adapter<?> parent, View view, int position, long id) {
    // 최초 선택된 라디오 이미지 제거
    if(!selLocation.equals("")) {
        listAdapter.setRbImage(selLocation, R.drawable.radio_normal);
        selLocation = "";
    }

    if(mView != null) {
        ((ImageView) mView).setImageResource(R.drawable.radio_normal);
    }
    // 현재 클릭돤 뷰 동그라미 체크
    View clickView = view.findViewById(R.id.mbl_radio_check);
    ((ImageView) clickView).setImageResource(R.drawable.radio_checked);

    // 현재 클릭한 뷰 저장
    mView = clickView;
}

setRbImage 메서드에서 notifyDataSetChanged() 를 사용하면 아이템 클릭시 처음 선택된 라디오 버튼은 없어지지만 새로 클릭한 라디오 버튼이 안나오구요. notifyDataSetChanged() 를 사용안하면 아이템 클릭시 처음 선택한것 안없어지고 새로 클릭한 라디오버튼 이미지가 나와서 두개가 그려집니다.

일일이 치느라 보기 불편하시겠지만 도와주세요~ 감사합니다

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • notifyDataSetChanged()을 호출했을 때, 처음 선택된 라디오 버튼은 사라지지만 새로 클릭한 라디오 버튼이 나오지 않는 이유는 다음과 같습니다.

    리스트뷰의 notifyDataSetChanged()를 호출하면 Adapter를 통해서 뷰를 새롭게 그립니다. 최초 선택된 라디오 버튼은 setRbImage() 함수를 통해서 모델을 변경했기 때문에(mSelect=R.drawable.radio_normal로) 뷰를 새롭게 그리더라도 의도한대로 그려지는 것입니다.

    새로 클릭한 라디오 버튼이 그려지지 않는 이유는 해당 모델에 '라디오 버튼 이미지를 보여줘'라는 정보가 없기 때문입니다. 즉, 올려주신 코드는 단지 뷰만 수정했기 때문에, notifyDataSetChanged()를 호출하면 뷰가 초기화되면서 그려지지 않는 것입니다.

    mListData.get(location).mSelect과 유사하게 모델에 현재 아이템이 선택되었는지 아닌지를 저장하는 방식으로(최초 선택된 라디오 버튼처럼) 구현하시기 바랍니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)