[내일배움캠프] 캠프 19주차 - 3/19(화) #ViewPager #ViewPager2

0
post-thumbnail

📝TIL

📝ViewPager & ViewPager2

  • 여러 개의 View를 뷰 페이저로 스와이프하여 넘기는 것을 구현해야했다.
  • 여러 개의 Fragment를 뷰 페이저로 스와이프하여 넘기는 것 구현해봤지만 ([Android 앱 개발 심화] 과제 - 이미지 검색 앱 (1) ViewPager2 & TabLayout),
    여러 개의 View를 하는 것은 처음이라, 그 방법에 대해 알아보다가 뷰 페이저에 관한 좋은 글을 발견하게 되어 그 내용을 정리해보았다.

ViewPager

📌참고 자료

  • 2015년에 ViewPager가 처음 등장함
  • ViewPager를 구현하려면 추상 클래스인 PagerAdapter를 상속하여 구현해야 함
  • PagerAdapter를 상속한 하위 클래스는 4개의 메소드를 오버라이딩 해야
    • instantiateItem()
      public @NonNull Object instantiateItem(@NonNull ViewGroup container, int position)
      • Create the page for the given position.
      • The adapter is responsible for adding the view to the container given here, although it only must ensure this is done by the time it returns from finishUpdate.
    • destroyItem()
      public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object)
      • Remove a page for the given position.
      • The adapter is responsible for removing the view from its container, although it only must ensure this is done by the time it returns from finishUpdate.
    • getCount()
      public abstract int getCount()
      • Return the number of views available.
    • isViewFromObject()
      public abstract boolean isViewFromObject(@NonNull View view, @NonNull Object object)
      • Determines whether a page View is associated with a specific key object as returned by instantiateItem.
  • 개발자들이 개발하기 쉽도록, 구글이 PagerAdapter를 상속해서 구현해놓은 2가지 어댑터를 제공함
    • FragmentPagerAdapter
      • 각 페이지가 프래그먼트로 되어있을 때 사용하는 어댑터
      • 모든 프래그먼트를 메모리에 저장해둠
    • FragmentStatePagerAdapter
      • 각 페이지가 프래그먼트로 되어있을 때 사용하는 어댑터
      • 프래그먼트 메모리에 생성 -> 필요 없어지면 제거 -> 필요해지면 메모리에 다시 생성
        (메모리에는 각 프래그먼트의 상태 값만 저장)
  • ViewPager는 뷰를 재사용하는 매커니즘을 사용하지 않는다
    -> 페이지가 넘어갈 때 instantiateItem()과 destroyItem()을 호출하여 뷰를 붙였다 떼었다 한다
    -> i번째 페이지에서 (i+1)번째 페이지로 넘기는 경우, (i-1)번째 페이지 떼어짐 & (i+2)번째 페이지 붙여짐

ViewPager2

📌참고자료

  • 2019년에 ViewPager2가 새로 등장함!
    -> ViewPager, FragmentPagerAdapter, FragmentStatePagerAdapter deprecated
  • ViewPager2가 나오게 된 이유 중 하나는, notifyDatasetChanged()가 정상적으로 실행되지 X 때문
  • ViewPager2에서 개선된 사항
    • Modifiable Fragment Collections 정상 지원
      -> notifyDatasetChanged() 비정상 동작 해결
    • DiffUtil 사용 가능
      -> RecyclerView 기반으로 동작하기 때문
  • ViewPager2는 뷰를 재사용하는 매커니즘을 사용한다!
  • ViewPager2 사용 시, 추상 클래스인 RecyclerView.Adapter를 상속해서 구현해야 함
    • RecyclerView.Adapter
      • 각 페이지가 뷰로 되어있을 때 사용
    • FragmentStateAdapter
      • RecyclerView.Adapter를 상속하는 추상 클래스
      • 각 페이지가 프래그먼트로 되어있을 때 사용
profile
Be able to be vulnerable, in search of truth

0개의 댓글