ViewPager
스와이프 기능을 통해서 콘텐츠를 전환할 수 있는 요소이다.
ViewPager자체가 화면을 그리는 기능을 하는 것이 아니라 여러 View widget들을 사용하는 컨테이너의 한 종류로 볼 수 있고, 화면 전환을 목적으로 하는 녀석이다.
ViewPager는 View나 ViewGroup에서처럼 Adapter를 사용한다.
ViewPager에서 사용하는 PagerAdapter는 아래에 요약을 했다.
ViewPager는 기본적으로 전환에 필요한 모든 페이지를 생성해놓고 보여주는 것이 아니다. 스와이프로 바로 이동이 가능한 좌우에 한 개의 페이지씩만 생성해서 유지하며 현재 상태에 있는 페이지를 Key Object로써 페이지 참조 및 식별을 위해서 ArrayList로 관리를 하고 있다.
그 외의 페이지들은 모두 생성을 하지 않고 있으며, 생성을 했어도 범위에서 벗어나면 destroy하게 된다.
즉 뷰 페이저는 최대 3개의 페이지를 유지하고 있는 것이다.
PagerAdapter
PagerAdapter는 ViewPager에서 이용하는 페이지 뷰를 생성하기 위한 용도의 어뎁터이다.
일반적으로 AndroidAdpater들은 데이터 리스트에 포함된 데이터를 한개씩 하나의 View(View Group)으로 매핑하는 역할을 한다. 안드로이드 SDK에서 제공하는 어뎁터들이 사용자의 데이터 셋에서 뷰를 만들어내는 역할을 공통적으로 수행을 하지만 각 어댑터 클래스에 따라서 각자가 필요한 메서드들을 work flow에 맞게 갖고 있고 Override 해서 개발자들이 사용한다.
이어서 다시 PagerAdapter를 보게되면 PagerAdapter는 구현해주어야 할 메서드가 4개가 있다.
- instantiateItem(ViewGroup container, int position)
- getCount()
- isViewFromObject(View view, Object object)
- destroyItem(ViewGroup container, int position, Object object)
1. instantiateItem(ViewGroup container, int position)
화면에 표시할 페이지 뷰를 만드는 실질적인 작업을 수행하는 함수이다. position에 해당하는 페이지를 생성하게 되며, container(ViewGroup 객체)에 적용하게 된다.
페이지를 식별하기 위한 Object객체를 return하는데 보통 생성된 페이지 뷰의 참조를 리턴하고, 페이지를 식별할 수 있는 Key Object를 리턴한다.
2. getCount()
전체 페이지 수를 return하는 함수이다. 하지만 여기서 보다시피 Override 해서 구현해주어야 할 함수다.
즉 전체 페이지 수를 개발자가 정한다는 것이다.
3. isViewFromObject(View view, Object object)
생성된 페이지 뷰가 키 객체와 관계가 있는지 확인하는 역할을 수행한다.
보통 아래와 같이 사용되며 (View)의 뷰 부분은 페이지 뷰에 따라서 달라진다. LinearLayout이든지 다양하게 올 수 있는데 페이지 레이아웃 xml에 사용했던 것을 이용한다.
@Override
public boolean isViewFromObject(View view, Object object){
return (view == (View) object)
}
사용법
- MainActivity Layout에 ViewPager추가
- ViewPager를 구성하는 Layout (xml) 작성
- PagerAdapter를 구현할 Adapter class를 작성 - 여기서 위의 4개의 메서드들을 작성 + LayoutInflater를 통해서 뷰로 변환
- MainActivity에서 ViewPager객체에 작성한 Adapter 할당
<참조>
'study > android' 카테고리의 다른 글
[android] Volley (0) | 2019.09.19 |
---|---|
[android] LayoutInflater & Factory Method (0) | 2019.09.17 |
[android] drawable (0) | 2019.09.17 |
[android] Activity & Intent (0) | 2019.09.10 |
[android] Toast 메시지 -Context (0) | 2019.09.08 |