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

oncreateviewholder 재호출 못하게?

0 추천
리사이클러뷰 1개에 멀티뷰홀더가 8개정도 있구요 이중 1개가 유튜브인데,

유튜브가 처음에 들어왔을때 로딩하면서 썸네일을 로드합니다.

그 뒤로 onbindviewholder을 타면서 재활용을 하면 문제가 없지만.. 스크롤을 좀내렸다가 다시 그 유튜브로 올때 oncreateviewholder가 호출되서 유튜브를 한번 로딩된 유튜브를 다시 재로딩합니다.

oncreateviewholder을 1번만하고 이후에는 재활용만 할수있게는 못하나요?
수원통학러 (3,570 포인트) 님이 2022년 1월 16일 질문
필요하다면 강제로 캐시의 크기를 조절할 수 있는 걸로 알고 있어요. 아래 블로그를 한번 읽어 보세요.
https://medium.com/@naveengoyal87/deep-dive-into-the-recyclerview-73868f3b38ed

그리고 말씀하시는 증상은 뷰홀더 재사용문제가 아니라 뷰홀더 상태관리 문제일 가능성이 많아 보여요. 스크롤을 할 때 뷰홀더를 재사용한다고 유투브가 한번만 재생된다는 보장은 없을 것 같은데요. 스크롤이 발생할 때 onBindViewHolder가 호출될 거고, 여기에 유투브를 재생하게 하는 코드가 있으면, 당연히 onBindViewHolder가 호출될 때 다시 재생이 되겠죠. 다시 재생이 안되게 하려면 기본적으로 이미 재생이 되었다는 플래그를 가지고 있다가 이 플래그가 존재하면 다시 재생하지 않도록 해야겠죠. 뷰홀더에 체크박스가 있을 때 이걸 관리하는 것과 비슷한 개념으로 보시면 될 것 같은데요.
뷰상태를 관리하는 부분을 다시 한번 확인해 보세요.
한번만 재생을 원하는게아니고, 그 유튜브 썸네일이 보이기전에 로딩을 하더라구요 createviewholder될때마다.. 이걸 한번만 로딩하고 그이후에는 그 화면을 나가지않는이상 로딩을 안하고 그대로 하고싶은데, 방법이 없을까 해서요 그 유튜브앱은 로딩을 가린건지 모르겠지만 처음에 들어오면 로딩하고 썸네일들이 다 그냥 바로 보이고 스크롤 내려도 페이징하느라 로딩하고 스크롤 왔다갔다해도 한번 로딩된건 안하잖아요 썸네일을 그런느낌으로요
앞에서 말씀드린 뷰홀더에 사용되는 데이터의 상태를 관리하세요.
아아 현재 플래그도 둬서 디버깅, 로그로하면 현재 딱 한번만 호출되고는 있습니다 (커스텀뷰에서요 이 커스텀뷰는 bindeviewholder쪽에서 쓰고 있구요) oncreateviewholder가 되면 리셋이 되버리네요..
상태관리를 커스텀뷰로만 끝내시면 안 될 것 같고, 어댑터에서 사용하는 데이터 자체를 업데이트 하셔야 할 것 같은데요. 말씀하신대로 커스텀뷰는 onCreateViewHolder가 호출되면 생성이 되는 거니까요.
어떻게 업데이트를 해야된다는거지 알수있을까요?
해시맵으로 그 유튜브 url을 담고 널일때만 onbindviewholder을 해봤는데, 최초에만 나오고 다시오면 로딩만 계속하는 상태가 되서요
간단하게 말씀드릴게요.

뷰쪽에서 이렇게 데이터를 어댑터에 넘기죠. 그리고 비디오의 상태를 뷰홀더 부터 받을 수 있도록 콜백을 연결합니다. 콜백을 받게 되면 원본 데이터를 업데이트 하고 submit을 다시 합니다.
adapter.submitList(data) { item ->
      updateOriginalDataAndSubmit()
}

뷰홀더에서 이벤트가 발생하면 콜백함수를 실행을 합니다.
class MyViewHolder(
   itemView: View,
   onThumbnailLoaded: (Item) -> Unit
): RecyclerView.ViewHolder(itemView) {

    fun bind(item: Item) {
         if (thumbnailLoaded) {
             onThumbnailLoaded(item)
         }
    }
}

DiffUtil을 사용하지 않는 다면 뷰쪽에서 콜백을 처리하지 않고 adapter에서 SparseArray같은 걸 써서 별도로 아이템별 Boolean 플래만 처리하도록 할 수도 있겠죠. 화면상에서만 보이는 Boolean 값을 업데이트할 때 이런 식으로 처리하는 경우도 있습니다.
어떤 접근방법을 택하느냐에 따라 비디오 재생 상태 또한 보관할 필요가 생길 수도 있어요.

답변 달기

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