삭제 버튼을 누르면 리스트뷰를 삭제모드로 보여주고 다시 클릭하거나 삭제 동작을 완료하면 원래 모드로 돌아오는 걸 구현하시는 것 같네요. 구글 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(이게 맞을 겁니다) 로 해당 체크박스가 초점이 있는 상태에서만 리스너 내부가 호출되도록 하시면 될 것 같습니다.