발생한 이슈

기존 구조

11월.png

<aside> 📏 Activity + ViewPager2

Fragment + RecyclerView (월별 달력)

ViewHolder = DateItem (일자별 아이템)

DateItem = TextView + ImageView

</aside>

테스트 결과

개별 Pool 사용

개별 Pool 사용

Untitled

측정/레이아웃, 입력 처리 및 애니메이션 수치높게 나오는 것을 확인할 수 있었습니다.

→ 프레임당 16.67ms, 초당 60프레임을 달성하려면 초록색선 아래에 머물러 있어야 합니다.

초당 60프레임을 달성하기 위한 기준에 비해 세그먼트 수치가 상당히 높게 나오는 것을 확인할 수 있었습니다.

해결1. 공유 ViewPool 사용 (실패)

아이디어

<aside> 💡 RecycledPool을 공유, ViewHolder 재사용으로 성능높이기

</aside>

Untitled

Android Developers - Slow rendering

Android Developers - Slow rendering

적용 코드

// CalendarViewModel , CalendarActivity 의 ViewModel
val viewPool = RecyclerView.RecycledViewPool().apply {
		// 각 viewType 에 max pool size 를 설정
    setMaxRecycledViews(0, 210)  // 5 (offscreenPageLimit * 2 + 1) * 42 (item size) 
}
// DateFragment: initAdaptor() 내부 adapter 초기화 전, ViewPager 의 fragment
binding.rvCalendar.setRecycledViewPool(activityViewModel.viewPool)
// 다른 RecyclerView 에서 뷰를 즉시 사용할 수 있도록 설정
(binding.rvCalendar.layoutManager as GridLayoutManager).recycleChildrenOnDetach = true