Android

[Android] ViewPager

은 딩 2023. 1. 2. 08:11

Viewpager란?

  :  여러개의 화면(Fragment)을 책 페이지처럼 한 장씩 보도록 지원하는 기능.
=> (가로) 스크롤뷰 + 스크롤 위치를 강제시키는 기능이 추가된 개념.
=> 인스타그램 피드 느낌

 

 

사용법

1. 액티비티에 프래그먼트를 직접 올리는게 아님.
=> ViewPager를 액티비티에 올려두고
=> 이 ViewPager의 재료로써 프래그먼트들을 제공하는 형태로 사용.

2. 액티비티에 <androidx.~.~.ViewPager> 태그를 배치 + 아이디 부여

// activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <androidx.viewpager.widget.ViewPager
        android:id="@+id/mainViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

3. 필요한 만큼 화면에 배치할 프래그먼트들을 제작하자.

4. 프래그먼트들을 ViewPager에서 위치에 맞게 뿌려주자. => Adapter 활용.
=> FragmentPagerAdapter를 상속받는 클래스를 만들어주자.

(부모클래스인 FragmentPagerAdapter도 기본생성자를 지원하지 않는다.)
=> 주 생성자에서 필요한 재료를 받아다 부모 클래스에게 전달하자.

class 어댑터이름(fm : FragmentManager) : FragmentPagerAdapter(fm)

 

필수 오버라이딩 함수 2개를 구현 (Alt + Enter => Implement... 선택)
1) getItem : 각각의 position에 맞는 Fragment가 어떤 Fragment인지 명시해주는 함수.
=> 각 상황별로 프래그먼트를 객체화해서 리턴처리.
2) getCount : 뷰페이저가 총 몇페이지를 표현하고싶은지 숫자로 리턴.

리스트뷰의 어댑터를 리스트뷰와 연결하던것처럼, 뷰페이저어댑터도 ViewPager와 연결해서 화면에 띄우자.
=> 어댑터의 생성자를 호출할때 그 재료로 supportFragmentManager를 집어넣자.

// MainViewPagerAdapter.kt


package com.eunjeong.viewpager.adapters

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import com.eunjeong.viewpager.fragments.FirstFragment
import com.eunjeong.viewpager.fragments.SecondFragment
import com.eunjeong.viewpager.fragments.ThirdFragment

class MainViewPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
    override fun getCount(): Int {
        return 3 // 몇장짜리인지
    }

    override fun getItem(position: Int): Fragment {
        if (position == 0){
            return FirstFragment()
        }
        else if (position == 1){
            return SecondFragment()
        }
        else{
            return ThirdFragment()
        }
    }

}

5. 마지막으로 MainActivity에서 Adapter 연결

package com.eunjeong.viewpager

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.eunjeong.viewpager.adapters.MainViewPagerAdapter
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    lateinit var mViewPagerAdapter : MainViewPagerAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mViewPagerAdapter = MainViewPagerAdapter(supportFragmentManager)
        mainViewPager.adapter = mViewPagerAdapter

        // 페이지가 많아지면 간단하게 부드럽도록 지원하는 기능
        mainViewPager.offscreenPageLimit = 3


    }
}

https://github.com/Eundding/android_study/tree/master/ViewPager

 

GitHub - Eundding/android_study

Contribute to Eundding/android_study development by creating an account on GitHub.

github.com


참고 : class101+ 코딩티처 지니 강의