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

listview 혹은 recyclerview에서 자식 view 접근 문제

0 추천
안녕하세요

현재 음악 리스트 관련 앱을 만들고 있습니다.

앱은 음악 리스트를 보여주고 누르면 누른항목(현재 재생되는 항목) 의 item 배경이 바뀌고
이전, 다음곡 버튼을 누르면 현재 item의 배경을 흰색으로 만들고 이전, 다음 item 배경을 변경해줍니다
여기서 문제가 발생하는데요.

화면이 스크롤 되서 이동하면 정상적으로 이전, 다음 item을 못찾습니다.

자식 item에 접근 할 수 없는거 같아서 그러는거 같은데 혹시 listview 혹은 recyclerview에서 모든 자식 item 에 접근 하는 법이 없을까요?

(getChildAt은 이미 사용해보았고, getView에서 arrayList에 해당 View를 저장해서 쓰려고 했더니 스크롤마다 출력이 되서 중복저장되더라구요...)

쉽게 말하면 멜론 or 지니뮤직 같은 재생목록을 만들고 싶은것 입니다.
제깃 (120 포인트) 님이 2021년 2월 21일 질문
제깃님이 2021년 2월 22일 수정
어댑터 내에서 해당 로직을 다처리하려고 하지 마시고 데이터 부분, 이벤트과 UI 부분을 나누어 보세요.
리사이클러뷰에서 사용할 데이터는 어댑터에서 관리하시는 것보다 Presenter, ViewModel, Controller  같은 클래스들에서 전담해서 관리하시는 게 변경이 용이하고 이해가기 더 좋은 구조입니다. 이런 패턴을 사용하지 않으시다면 최소한 액티비티나 프레그먼트에서 쓰레드에서 데이터를 가져오신 다음 어댑터로 세팅해주시는 것이 바람직합니다. 어댑터에서 사용할 데이터는 어댑터 밖에서 관리하고 어댑터로 전달해 준다.
어댑터와의 커뮤니케이션을 리스너나 콜백을 통하여 하시기 바랍니다. 변경과 이해에 훨씬 더 용이한 구조입니다.
화면에 보여져야할 사항은 어댑터와 뷰홀더를 연계하여 작업하시면 되구요.
따라서, 님의 경우처럼 어떤 항목이 눌렸다 안눌렸다를 관리하려면 어댑터에서 사용할 데이터에 선택상태인지 아닌지 관리할 수 있는 항목이 존재해야 할 것 같습니다. 뷰홀더에서는 단순히 이 전달된 데이터를 화면에 맞춰서 그려주면 됩니다.
그리고 사용자가 선택한 데이터를 이용하는 부분은 앞에서 말씀드렸다시피 리스너를 통해 뷰홀더에서 아이템을 클릭할 떼 어떤 아이템이 선택되었는지 전달해 주시면 되겠죠. 그리고 원래 가지고 계시던 데이터셑에서 어떤 아이템서 어떤 아이템을 유저가 선택했는지 금방 찾을 수 있습니다.
그리고 리사이클러뷰에 보여지는 아이템의 숫자가 많아진다면 성능향상을 위해 DiffUtil이나 ListAdater를 사용하는 것을 고려해 보세요.
조언주신대로 이벤트 처리와 ui 처리를 나눠서 해결했습니다! 감사합니다!

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...