글쓴이 보관물: Toughman

Android RecyclerView 체크박스 상태 관리

개요

Android RecyclerView 는 화면에 보여지는 영역에서만 정의된 항목들이 유효합니다. 스크롤되어 다른 자료가 보여지게 되면 이전에 적용된 속성이 사라지게 됩니다. 대표적인 예가 체크박스 상태입니다. 화면에 보여질 때 체크하고 스크롤 후 다시 그 자료로 돌아와 보면 체크되지 않는 상태로 됩니다. 그래서 체크된 자료를 대상으로 처리하거나 전체선택/해제 기능을 구현할 때 이런 특성을 알고 있어야 합니다. 이번글에서는 전체선택/해제, 체크박스의 상태 유지 기능을 구현하는 방법을 알아보도록 하겠습니다.

체크박스 상태 저장

어디에선가는 체크박스 상태를 저장하고 있어야 합니다. 몇번째 체크박스가 체크되어 있는지에 관한 정보가 될 것입니다. 이글에서는 해시맵(Hashmap)을 이용해서 체크박스 상태를 저장해 보도록 하겠습니다. 다음과 같이 해시맵을 선언합니다. 리스트자료의 고유값을 키(Key)로 하고 값(Value)은 위치(Position) 값으로 저장해 보겠습니다.

companion object {
    lateinit var selectCheckBoxPosition:HashMap<Int, Int>
    private set
}

전체선택/해제

먼저 체크박스를 전체 선택하는 체크박스가 정의되어 있고 그것을 클릭했을 때 전체선택/해제 정보를 해시맵에 할당해 보겠습니다.

viewBinding.checkAllCheckBox.setOnClickListener {
    selectCheckBoxPosition.clear()
    if (viewBinding.checkAllCheckBox.isChecked) {
        for ((index, listData:yourClass) in yourList.withIndex()) {
            selectCheckBoxPosition[listData.Seq] = index
        }
    }
    listAdapter.notifyDataSetChanged()
}

체크박스를 클릭하면 해시맵을 비웁니다. 체크가 되었다면 연결된 리스트의 자료를 대상으로 고유값을 키로해서 위치 정보를 저장합니다. 그 다음 어댑터에 자료가 변경되었다는 것을 알립니다.

체크된 항목 정보 저장

전체선택/해제와 방식은 비슷합니다. 리스트내의 체크박스를 체크하면 해시맵에 저장하고 해제하면 제외합니다.

override fun onBindViewHolder(holder: Holder, position: Int) {
    holder.bind(yourList[position])
    val seqCheckBox = holder.itemView.findViewById<CheckBox>(R.id.seq)
    seqCheckBox.setOnCheckedChangeListener(null)
    seqCheckBox.isChecked = yourActivity.selectCheckBoxPosition.containsValue(position)
    seqCheckBox.setOnClickListener {
        val seq = seqCheckBox.tag.toString().toInt()
        if (seqCheckBox.isChecked) {
            yourActivity.selectCheckBoxPosition[seq] = position
        } else {
            yourActivity.selectCheckBoxPosition.remove(seq)
        }
    }
}

onBindViewHolder 메소드에 체크박스의 정보를 가져와서 해시맵에 위치 값이 존재하면 체크상태로 변경합니다. 그 내부에 체크박스 클릭 리스너를 정의합니다. 체크하면 해시맵에 정보를 저장하고 해제하면 제외합니다.

직접 구현한 코드와 예제 코드의 스타일이 다를 수 있습니다. 그렇지만 체크박스의 정보를 저장하고 관리해야 한다는 것만 염두에 두시면 문제없이 기능을 구현하실 수 있을겁니다.

샤오미 미박스S 글로벌 버전

개요

샤오미 미박스S 글로벌 버전 은 순전히 개인적인 취향과 상황에 따라 선택했습니다. 별도의 지원을 받은 사실이 없습니다.

라즈베리파이로 구축된 동영상 및 넷플릭스 서버를 잘 이용하고 있었습니다. 특히 넷플릭스를 잘 보고 있었는데 어느날 부터인가 동영상이 재생은 되는데 화면이 이상하게 나타나는 현상이 있었습니다. 원래 라즈베리파이에서는 넷플릭스 프로그램이 지원되지 않습니다. 이것저것 바로 잡으려고 해 보았지만 잘 되지 않았고 해결될지도 확실하지 않았습니다. 그래서 셋탑박스를 구매하기로 마음 먹었습니다.

이름없는 제조사의 제품부터 가격이 꽤 나가는 제품까지 꽤 다양했는데 샤오미 미박스S 글로벌 버전이 필자에게는 적당해서 구매하게 되었습니다. 직구를 통해서 구매했는데 생각보다 배송이 빠르지는 않았습니다.

개봉

샤오미 미박스S 상자
샤오미 미박스S 상자

먼길(?)을 와서 그런지 상자가 약간 찌그러졌습니다. 하지만 안의 내용물은 문제없었습니다. 열어보니 본체가 바로 보입니다.

상자를 열어본 처음상태
상자를 열어본 처음상태

생각했던 것보다는 크기도 작고 가벼웠습니다. 윗면은 로고만 있고 아래는 다음과 같이 시리얼 정보가 있습니다.

아래 이미지
아래 이미지

상자 안쪽을 보니 전원어댑터, 리모콘, HDMI케이블 및 설명서가 같이 들어 있었습니다. 전원 어댑터는 EU 플러그로 구매했습니다. 리모콘용 건전지는 동봉되어 있지 않아서 AAA 건전지 2개를 사용했습니다.

전원어댑터, 리모콘, HDMI케이블
전원어댑터, 리모콘, HDMI케이블
본체와 설명서
본체와 설명서

설정

무선인터넷 접속 정보를 준비하고 전원, 모니터에 연결하니 잠시 후 설정 화면이 나타났습니다. 별다르게 어려운 것은 없으니 안내대로 진행하면 됩니다. 구글 계정에 로그인 하고 진행하면 넷플릭스, 유뷰브가 평소에 보던것과 같이 나타납니다.

구글 계정 로그인
구글 계정 로그인

장점

  1. 넷플릭스, 유튜브, 기타 동영상이 잘 재생됩니다.
  2. 구글 드라이브 같은 클라우드 저장소에 동영상 파일을 올려서 바로 재생할 수 있는 것이 매우 편했습니다. 파일 관리 앱을 설치해서 설정하면 됩니다.

단점

  1. USB 2.0 포트만 지원해서 외장 드라이브로 파일을 복사하거나 할 때 오래 소요됩니다.
  2. 간혹 리모콘, 시스템이 반응하지 않는 경우가 있습니다. 내부적으로 무엇인가 작업을 하는 것 같은데 진행상황을 알 수 없어 될때까지 기다려야 합니다.
  3. 리모콘 음성 찾기가 잘 되지 않았습니다. 발음이 나쁜것인지 요령이 없어서인지 원하는 컨텐츠를 검색하기가 어려웠습니다.
  4. 완전종료가 없고 리모콘의 전원버튼을 길게 누르면 재부팅만 있습니다. 필자의 경우 많이 사용하지 않는 편이라 그럴때는 완전히 시스템을 종료하고 싶은데 불가능합니다.
  5. 출력이 약해서 앰프기능이 없는 스피커를 연결하면 소리가 작습니다. 필자는 사용하던 앰프를 연결해서 문제가 없었는데 샤오미 박스S 자체만으로 큰 출력을 내기는 어렵습니다.

개인적으로 느끼는 단점의 개수가 많지만 이것을 모두 감수할 만큼 동영상 재생은 아주 만족스러웠습니다.