(Android/안드로이드) ViewPager2 사용할 때 반드시 주의해야 할 점 정리

개요


1. 구조


2. FragmentStateAdapter 사용 시 주의점

// 화면이 안바뀔 수 있음
adapter.list = newList
adapter.notifyDataSetChanged()
class MyAdapter(
    fragment: Fragment,
    private var items: List<Item>
) : FragmentStateAdapter(fragment) {

    override fun getItemCount() = items.size

    override fun createFragment(position: Int): Fragment {
        return MyFragment.newInstance(items[position])
    }

    override fun getItemId(position: Int): Long {
        return items[position].id
    }

    override fun containsItem(itemId: Long): Boolean {
        return items.any { it.id == itemId }
    }
}

3. Fragment Lifecycle 오해


4. offscreenPageLimit 남용 금지

viewPager.offscreenPageLimit = 5 // ❌

5. NestedScroll 충돌 (자주 발생)

ViewPager2
  └── RecyclerView
        └── Fragment
              └── RecyclerView
recyclerView.isNestedScrollingEnabled = false

viewPager2.getChildAt(0).overScrollMode = RecyclerView.OVER_SCROLL_NEVER

6. TabLayoutMediator 사용 시 메모리 누수

TabLayoutMediator(tabLayout, viewPager2) { tab, position ->
    tab.text = titles[position]
}.attach()
private var mediator: TabLayoutMediator? = null

override fun onDestroyView() {
    // detach 안 하면 View 참조 유지 → 누수 가능
    mediator?.detach()
    mediator = null
    super.onDestroyView()
}


Related Posts