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

리사이클러뷰 뷰홀더에서 다른 뷰홀더 접근

0 추천

안녕하세요.

맨 땅에 헤딩으로 독학하면서 코딩을 배우고 있는데



 

해당 뷰홀더의 스크롤 뷰를 스크롤할 때, 부모 레이아웃의 스크롤이 따라 움직이게 하는 것은 구현을 했는데

다른 뷰홀더 또한 스크롤이 따라 움직이게 할 수 있을까요?

현재 바인드된 뷰홀더에는 접근을 어떻게 할 수 있는지 궁금합니다.

 

        override fun onBindViewHolder(holder: ViewHolderForDayList, position: Int) {
            holder.setDay(dateData[position])

            holder.binding.scrollViewDayEvents.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
                this@Fragment1Schedule.binding.scrollViewTimeList.scrollTo(scrollX,scrollY)
            }
        }

현재 onBindViewHolder 메서드의 코드는 이렇습니다.

 

서한 (330 포인트) 님이 2021년 10월 23일 질문
서한님이 2021년 10월 23일 수정
뷰홀더라는 용어를 사용하셔서 리사이클러뷰를 사용하 수도 있다고 생각했다가, 위의 레이아웃을 리사이클러뷰로 만들기기는 부적합한 듯하게 보여 화면에 레이아웃을 뷰를 여러개 배치해서 날짜에 해당하는 부분을 스크롤할 때, 제일 왼쪽에 시간에 해당하는 부분도 같이 스크롤되게 만드신 것 같이 추측이 됩니다.
님이 원하시는 거는, Week에 있는 모든 뷰가 한 부모 레이아웃 안에서 스크롤이 되어야 하는데, 이렇게 하시려면
View를 확장한 커스텀 컴포넌트를 사용하시는게 제일 골치가 덜 아플 것으로 보입니다. 억지로 스크롤 위치를 맞추기에는 , 해결해야 할 부분이 너무 많을 것으로 보여요. 권장하고 싶은 방법은 Github에서 님이 만드시는 것과 동일한 기능을 제공하는 라이브러리들을  찾아서 어떻게 구현이 되있는지 확인해 보세요. 이 부분이 더 공부도 되고 제대로 구현하는 방법이 어떤지 알 수 있을 것 같아요. 아래의 두개 정도만 참조하셔도 될 것 같은데요. (둘다 Googgle Calendar 소스를 기반으로 작업한 느낌이 드네요)

https://github.com/alamkanak/Android-Week-View
https://github.com/guojunustb/sample-of-Android-week-view
이중 리사이클러뷰는 아니고 날짜가 표시되는 세로 줄 부분만 리사이클러뷰로 구현해놨고 안에는 스크롤 뷰로 구현했습니다

그래서 뷰홀더에 대한 레이아웃은 어차피 재사용되니깐 현재 바인드된 모든 뷰홀더의 레이아웃에 접근할 수 있을까 싶었습니다

제가 너무 두서없이 질문드린 것 같아서 본문에 사진 추가로 첨부했습니다.

답변 남겨주신 깃허브도 꼭 확인해보겠습니다 감사합니다

1개의 답변

+1 추천
 
채택된 답변
리사이클러뷰를 여러 개 사용해서 스크롤을 싱크 처리하는 건 적합한 방법이 아닌 듯 합니다.

님이 원하시는 걸 리사이클러뷰를 통해서 하시려면 리사이클러뷰를 하나만 사용하시고 커스텀  LayouManager 를 만드셔서 스크롤을 컨트롤 해야 할 거예요.

참고로 LayoutManager가 상당히 복잡합니다.
spark (224,800 포인트) 님이 2021년 10월 23일 답변
서한님이 2021년 10월 23일 채택됨
리사이클러뷰를 사용해야 한다면, 리사이클러뷰를 하나만 두고 어댑터에 제공하는 데이터를 화면에 보이는 형태로 설정해주는 약간 편법적인 방법도 생각해볼 수는 있습니다.

data class DayItem(
     val date: String,
     val time: String,
     val event: Event
)

data class WeekItem{
   val time: String,
   val monday: DayItem,
   val tuesday: DayItem,
   ...
   val sunday: DayItem
}
위처럼, 리사이클러뷰의 한 줄에 해당하는 시간, 월 - 일의 데이터를 시간대별로 리스트로 만들어서(List<WeekItem>) 어댑터에 세팅해주면 될 듯한테, 데이터를 만드는 과정이 복잡해 질 듯 하네요.

아이템별 가로 스크롤은 아래 클래스를 사용해볼 수도 있을 것 같구요.
https://developer.android.com/reference/androidx/recyclerview/widget/PagerSnapHelper

어쨋든, 님이 하시고 싶은 건, 간단하게 처리할 수 있는 방법이 없어 보여요. 시간을 들이셔서 제일 적합한 방법을 찾으시길 바래요.
...