Android

[Android] ViewPager1κ³Ό ViewPager2

Forest Yun 2021. 6. 18. 17:55
728x90

1. ViewPager

​

ViewPagerλŠ” 데이터λ₯Ό νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ ν‘œμ‹œν•˜κ³  쒌/우 뒀집기λ₯Ό 톡해 νŽ˜μ΄μ§€λ₯Ό μ „ν™˜ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆμ΄λ‹€.

​

​

​

1.2. μ•ˆλ“œλ‘œμ΄λ“œ μ–΄λŒ‘ν„°(Adapter)

​

μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ λ°μ΄ν„°λ¦¬μŠ€νŠΈλ₯Ό μ•„μ΄ν…œ λ‹¨μœ„μ˜ λ·° λ˜λŠ” λ·° μ§‘ν•©μœΌλ‘œ ν‘œμ‹œν•  λ•Œ, μ–΄λŒ‘ν„°(adapter)λ₯Ό μ‚¬μš©ν•œλ‹€.

μ•ˆλ“œλ‘œμ΄λ“œ μ–΄λŒ‘ν„°(Adapter)λŠ” 데이터 리슀트λ₯Ό μž…λ ₯λ°›μ•„ 화면에 ν‘œμ‹œν•  뷰듀을 μƒμ„±ν•œλ‹€.

​

​

μ•ˆλ“œλ‘œμ΄λ“œ μ–΄λŒ‘ν„°_yxxnForest

​

각 μ–΄λŒ‘ν„°λ“€μ˜ νŠΉμ„±μ— 따라 λ‹€λ₯΄κ²Œ method κ°€ μž‘μ„±λ˜μ–΄μ•Ό ν•œλ‹€. λ”°λΌμ„œ 각각의 methodλŠ” μ˜€λ²„λΌμ΄λ“œ(override)λ˜μ–΄μ•Ό ν•œλ‹€.

​

​

​

​

1.3. νŽ˜μ΄μ €μ–΄λŒ‘ν„° PagerAdapter

​

νŽ˜μ΄μ €μ–΄λŒ‘ν„°(PagerAdapter)λŠ” λ·°νŽ˜μ΄μ €(ViewPager)의 νŽ˜μ΄μ§€λ·°λ₯Ό μƒμ„±ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” μ–΄λŒ‘ν„° ν΄λž˜μŠ€μ΄λ‹€.

​

​

νŽ˜μ΄μ €μ–΄λŒ‘ν„°_yxxnForest

​

​

PagerAdapter λŠ” 좔상 클래슀둜, PagerAdapter λ₯Ό λΆ€λͺ¨ 클래슀둜 ν•˜μ—¬ 이λ₯Ό 상속받은 μ–΄λŒ‘ν„° 클래슀 객체λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

​

​

νŽ˜μ΄μ €μ–΄λŒ‘ν„° μΆ”μƒν΄λž˜μŠ€_yxxnForest

​

​

​

μžμ‹ μ–΄λŒ‘ν„° κ΅¬ν˜„ μ‹œ μ˜€λ²„λΌμ΄λ“œ(override)ν•΄μ•Ό ν•˜λŠ” methode

instantiateItem(ViewGroup, int) position에 ν•΄λ‹Ήν•˜λŠ” νŽ˜μ΄μ§€ 생성 (예. νŽ˜μ΄μ§€1->2->3)
destroyItem(ViewGroup, int, Object) position μœ„μΉ˜μ˜ νŽ˜μ΄μ§€ 제거 (예. νŽ˜μ΄μ§€1->2->3)
getCount() μ‚¬μš© κ°€λŠ₯ν•œ 뷰의 개수λ₯Ό λ°˜ν™˜, λ·°νŽ˜μ΄μ €μ˜ 전체 νŽ˜μ΄μ§€ 수 κ²°μ •
(예. νŽ˜μ΄μ§€ 3개)
isViewFromObject(View, Object) νŽ˜μ΄μ§€λ·°κ°€ νŠΉμ • ν‚€ 객체(key object)와 μ—°κ΄€λ˜λŠ”μ§€ μ—¬λΆ€

​

​

​

1.4 λ·°νŽ˜μ΄μ €μ˜ νŽ˜μ΄μ € 생성과 관리

​

λ·°νŽ˜μ΄μ €λŠ” 항상 ν˜„μž¬ μœ„μΉ˜ν•œ νŽ˜μ΄μ§€λ₯Ό ν¬ν•œν•˜μ—¬ 쒌 - 우 ν•˜λ‚˜ μ”©, 총 μ„Έ 개의 νŽ˜μ΄μ§€λ₯Ό 생성 및 κ΄€λ¦¬ν•œλ‹€.

​

λ·°νŽ˜μ΄μ €μ˜ νŽ˜μ΄μ € 생성과 관리_yxxnForest

​

​

​

2. ViewPager2

​

쒌우 슀크둀링만 κ°€λŠ₯ν–ˆλ˜ ViewPager1κ³Ό λ‹€λ₯΄κ²Œ μƒν•˜μ’Œμš° 슀크둀링이 κ°€λŠ₯ν•˜λ‹€.

ViewPager2λŠ”RecyclerViewλ₯Ό 기반으둜 ν•œλ‹€.

PagerAdapterμ—μ„œ RecyclerView.Adapter둜 λŒ€μ²΄κ°€λŠ₯ν•˜λ‹€.

notifyDataSetChanged κΈ°λŠ₯ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€

νŽ˜μ΄μ§€ 이벀트λ₯Ό addPgerChangeListener()μ—μ„œ RegisterOnpageCallBack()으둜 λŒ€μ²΄ν•œλ‹€.

FragmentStatePagerAdapterμ—μ„œ FragmentStateAdapter둜 λŒ€μ²΄ν•œλ‹€.

​

​

​

ViewPager2λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” bulid.gradle(Module:app) νŒŒμΌμ— λ‹€μŒ AndroidX 쒅속 ν•­λͺ©μ„ μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

dependencies { implementation "androidx.viewpager2:viewpager2:1.0.0" }

​

​

​

메인 λ ˆμ΄μ•„μ›ƒ xml νŒŒμΌμ— <ViewPager2> μœ„μ ―μ„ μΆ”κ°€ν•œλ‹€.

activity_main.xml

<androidx.viewpager2.widget.ViewPager2 xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" />

​

​

​

ViewPager2λŠ” RecyclerView와 μ‚¬μš©λ²•μ΄ κ°™λ‹€. λ”°λΌμ„œ RecyclerView.Adapter와 ViewHolderκ°€ ν•„μš”ν•˜λ‹€.

​

​

RecyclerView.Adapterλ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ μ˜€λ²„λΌμ΄λ“œ(override)λ˜μ–΄μ•Ό ν•˜λŠ” methode κ°€ μžˆλ‹€.

createViewHolder(ViewGroup parent, int viewType) viewTypeν˜•νƒœμ˜ μ•„μ΄ν…œ λ·°λ₯Ό μœ„ν•œ 뷰홀더 객체 생성
onBindViewHolder(ViewHolder holder, int position) position 에 ν•΄λ‹Ήν•˜λŠ” 데이터λ₯Ό λ·°ν™€λ”μ˜ μ•„μ΄ν…œλ·°μ— ν‘œμ‹œ
(λ‚˜: 각 뷰에 λ“€μ–΄κ°€μ•Όν•  데이터λ₯Ό μ•„μ΄ν…œ μœ„μΉ˜μ— 맞게 데이터 λŒ€μž…ν•΄μ£ΌλŠ” 것)
getItemCount() 전체 μ•„μ΄ν…œ 개수 λ°˜ν™˜
(λ‚˜: 전체 뷰의 수. λͺ‡ νŽ˜μ΄μ§€κ°€ μžˆλ‚˜)

​

​

​

μžμ„Έν•œ μ˜ˆμ œλŠ” 좔후에 ν† μ΄ν”„λ‘œμ νŠΈλ₯Ό 톡해 정리할 μ˜ˆμ •μ΄λ‹€.

​

​

​

​

​

​

곡뢀할 λ•Œ μ°Έκ³ ν•œ 자료

https://recipes4dev.tistory.com/148

https://lakue.tistory.com/18

https://developer.android.com/reference/kotlin/androidx/viewpager/widget/PagerAdapter

https://recipes4dev.tistory.com/154?category=790402

https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/RecyclerView.Adapter

https://www.youtube.com/watch?v=FJvUKLNx6nw&list=PLhba_6zsWOEJr53c2yvx5IC--XRQpdLM6&index=3&t=0s

[좜처] [Anroid] ViewPager1과 ViewPager2|

728x90