마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트뷰에 체크박스를 gone한 상태에서 버튼 클릭 시 visible할때 오류

0 추천

제목 그래도이긴한데

우선 제 리스트뷰 item에 체크박스(gone)와 텍스트뷰로 이루어져 있습니다.

근데 헤더에 있는 삭제 버튼을 클릭 시(이벤트는 어댑터에서 처리) 기본으로 gone 되어져있는 체크박스들을 visible 하는데 모든 항목들이 visible 되는게 아닌 랜덤하게 일부 항목만 visible 되고 있습니다....

notifyDataSetChanged(); 도 써보고 하는데 해결이 안되네요....

헤더에 위치해있는 삭제 버튼을 어댑터에 구현한 부분입니다...도와주세요

너무 초보 (160 포인트) 님이 2021년 1월 11일 질문

1개의 답변

+1 추천
 
채택된 답변

삭제 버튼을 누르면 리스트뷰를 삭제모드로 보여주고 다시 클릭하거나 삭제 동작을 완료하면 원래 모드로 돌아오는 걸 구현하시는 것 같네요. 구글 Gmail앱처럼 말이죠. 물론  Gmail app 앱은 롱클릭하면 삭제모드로 변경되기는 합니다만, 기본적으로는 같은 동작으로 보입니다. 제가 질문을 이해한 것이 맞다는 전제 하에 답을 하겠습니다.

님처럼 아이템 레이아웃에 체크박스를 두고 보여주었다 안보여주었다 할 수도 있구요. 모드에 따라 뷰타입을 바꿔서 보여줄 수도 있습니다. 어쨌든 삭제모드인지 아닌지 체크하는 것과, 어떤 아이템이 선텍되었는지 체크할 수 있어야겠죠. 데어터 구조를 어떻게 가져가느냐가 중요한 사항 중의 하나인데요. 삭제모드는 모든 아이템이 동일한 상태를 가지기 때문에 아이템별로 삭제모드를 저장할 필요는 없겠네요. 어댑터안에 boolean 변수를 하나두고 이걸 업데이트 하는 형태로 하시면 될 것 같습니다.

//Activity

listAdapter // 편의상 어댑터 변수라고 하겠습니다.

deleteModeButton.setOnClickListener(view -> {
      listAdapter.toggleDeleteMode();
});

public class ListAdatper ... {

    private boolean deleteMode = false
    public void setDeleteMode(mode: Boolean) {
         this.deleteMode = mode;
         notifyDataSetChanged();
    }
  
    public void toggleDeleteMode() {
          setDeleteMode(!mode);
    }

    public boolean getDeleteMode() {
        return deleteMode;
    }
}

 이렇게 시작하시면 될 것 같은데, 질문에 리스트뷰를 쓰신다고 하니, 전 리스트 어댑터를 안쓴지가 너무 오래돼서 더 구체적인 답은 못드리겠고, 위의 deleteMode에 따라 각 아이템별로 체크박스의 visibility를 변경하시면 될 것 같습니다. 그리고 각 아이템의 체크상태는 SparseArray를 멤버변수로 선언하신 다음에 여기서 체크박스를 리스닝하신 다음 변경여부를 저장하시면 될 것 같네요. 체크박스는 setChecked호출하게 되면 리스너가 호출되므로, hasFocus(이게 맞을 겁니다) 로 해당 체크박스가 초점이 있는 상태에서만 리스너 내부가 호출되도록 하시면 될 것 같습니다.

spark (229,630 포인트) 님이 2021년 1월 11일 답변
너무 초보님이 2021년 1월 12일 채택됨
감사합니다!!
비슷한 방식으로 어찌저찌 체크 변수를 둬서 해결했습니다!
안녕하세요 저도 님과 같은 상태인데 체크 변수를 어떻게 둬서 하셨나요?? ㅠㅜㅜ
어댑터 내부에 SparseArray타입의 변수를 하나 둬서 각 아이템이 삭제 선택이 되었는지 여부를 저장하도록 하시면 됩니다. 위의 제 답을 보니 그 부분에 대한 언급이 빠져 있네요. 그리고 삭제모드는 굳이 어댑터에 있지 않아도 상관없고 액티비티나 뷰모델이 있다면 뷰모델에 있는 것이 더 좋아 보이네요. 물론 뷰모델을 사용한다면 SparseArray에 해당 하는 부분도 모두 뷰모델에 위치시키면 될 것 같구요.
감사합니다!!!!!!!!
...