ViewPager의 onPageChangeListener는 어떻게 사용하나요?
_____Q1: ViewPager.OnPageChangeListener란 무엇인가요?
A1:
- ViewPager 내부 페이지 전환(스와이프) 이벤트를 감지하고 처리할 수 있는 인터페이스입니다.
- 페이지가 스크롤될 때, 완전히 선택되었을 때, 스크롤 상태가 변경될 때 콜백을 제공합니다.
Q2: 어떤 메서드를 구현해야 하나요?
A2: OnPageChangeListener에는 총 세 가지 콜백 메서드가 있습니다.
1. onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
- 페이지 이동 중 호출
- position: 현재 페이지 인덱스
- positionOffset: 페이지 전환 비율(0.0~1.0)
- positionOffsetPixels: 스크롤된 픽셀 수
2. onPageSelected(int position)
- 페이지 전환이 완료되어 새로운 페이지가 선택될 때 호출
- position: 새로 선택된 페이지 인덱스
3. onPageScrollStateChanged(int state)
- ViewPager의 스크롤 상태 변경 시 호출
- state 값:
• SCROLL_STATE_IDLE (0) – 정지 상태
• SCROLL_STATE_DRAGGING (1) – 사용자가 터치하여 드래그 중
• SCROLL_STATE_SETTLING (2) – 자동 애니메이션 이동 중
Q3: 리스너를 설정하는 방법은?
A3:
1. 익명 클래스 사용
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override public void onPageScrolled(int pos, float off, int offPix) { /* ... */ }
@Override public void onPageSelected(int pos) { /* ... */ }
@Override public void onPageScrollStateChanged(int state) { /* ... */ }
});
2. 별도 객체(클래스)로 구현
class MyPageChangeListener implements ViewPager.OnPageChangeListener { … }
viewPager.addOnPageChangeListener(new MyPageChangeListener());
Q4: 언제 주로 사용하나요?
A4:
- 커스텀 인디케이터(탭, 점 등) 업데이트
- 현재 페이지에 따라 UI(버튼 활성화/비활성화, 텍스트 변경) 조절
- 비동기 데이터 로딩(새 페이지 진입 시 서버 호출)
- 페이저 전환 애니메이션 추가 제어
Q5: 샘플 코드 예시
A5:
```java
PagerAdapter adapter = new MyPagerAdapter(...);
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// 페이지 이동 중 호출
indicatorView.setProgress(position + positionOffset);
}
@Override
public void onPageSelected(int position) {
// 페이지 전환 완료 후 호출
titleTextView.setText("Page " + (position + 1));
}
@Override
public void onPageScrollStateChanged(int state) {
// 스크롤 상태 변화 시 호출
if (state == ViewPager.SCROLL_STATE_IDLE) {
// 정지 상태일 때 작업
}
}
});
```
Q6: 기존 리스너 제거 방법은?
A6:
- removeOnPageChangeListener(listener) 사용
- 익명 클래스일 경우 참조 변수를 미리 선언한 후 등록/해제
```java
ViewPager.OnPageChangeListener listener = new MyListener();
viewPager.addOnPageChangeListener(listener);
// 나중에
viewPager.removeOnPageChangeListener(listener);
```
Q7: 주의사항 및 팁
A7:
- onPageScrolled는 매우 자주 호출되므로 무거운 연산 지양
- addOnPageChangeListener 대신 setOnPageChangeListener(구버전) 메서드는 deprecated
- 동시에 여러 리스너 등록 가능(내부에서 리스트로 관리)
- FragmentStatePagerAdapter 사용 시 페이지 재사용에 따른 인덱스 관리 유의
이상으로 ViewPager.OnPageChangeListener의 기본 개념과 활용 예시를 정리했습니다. 이를 참고하여 원하는 페이지 전환 감지 로직을 구현해 보세요!
이를 통해 페이지가 변경될 때마다 특정 동작을 수행할 수 있습니다.
다음은 `ViewPager`에 `OnPageChangeListener`를 설정하고 사용하는 방법에 대한 예시입니다: 1. 레이아웃 파일에 ViewPager 추가 먼저, XML 레이아웃 파일에 `ViewPager`를 추가합니다.
```xml
2. 어댑터 생성 `ViewPager`와 함께 사용할 어댑터를 생성합니다.
예를 들어, 간단한 PagerAdapter를 아래와 같이 만들 수 있습니다.
```java public class MyPagerAdapter extends PagerAdapter { private Context context; public MyPagerAdapter(Context context) { this.context = context; } @Override public Object instantiateItem(ViewGroup container, int position) { // 페이지를 생성하고 container에 추가 View view = LayoutInflater.from(context).inflate(R.layout.page_layout, container, false); container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public int getCount() { return 3; // 페이지 수 } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } } ```
3. Activity/Fragment에서 ViewPager와 Listener 설정 `Activity`나 `Fragment`에서 `ViewPager`와 어댑터를 설정한 후, `OnPageChangeListener`를 추가합니다.
```java public class MainActivity extends AppCompatActivity { private ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = findViewById(R.id.viewPager); MyPagerAdapter adapter = new MyPagerAdapter(this); viewPager.setAdapter(adapter); // OnPageChangeListener 설정 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // 페이지 스크롤 중일 때 호출 } @Override public void onPageSelected(int position) { // 페이지가 변경되었을 때 호출 Toast.makeText(MainActivity.this, "Selected page: " + position, Toast.LENGTH_SHORT).show(); } @Override public void onPageScrollStateChanged(int state) { // 페이지 스크롤 상태가 변경되었을 때 호출 } }); } } ```
4. 메소드 설명 - onPageScrolled(int position, float positionOffset, int positionOffsetPixels) : 사용자가 페이지를 스크롤할 때마다 호출됩니다.
이 메소드는 현재 페이지 위치와 함께 스크롤 진행 상태를 나타내는 정보를 제공합니다.
- onPageSelected(int position) : 새로운 페이지가 선택되었을 때 호출됩니다.
해당 페이지의 인덱스가 전달됩니다.
- onPageScrollStateChanged(int state) : 페이지 스크롤의 상태가 변경되었을 때 호출됩니다.
상태는 다음과 같은 값을 가질 수 있습니다: - `ViewPager.SCROLL_STATE_IDLE`: 페이지가 멈춰 있는 상태 - `ViewPager.SCROLL_STATE_DRAGGING`: 사용자가 페이지를 드래그하고 있는 상태 - `ViewPager.SCROLL_STATE_SETTLING`: 페이지가 이동하고 있는 안착 상태 이와 같은 방식으로 `ViewPager`의 페이지 변경 이벤트를 감지하고 원하는 동작을 수행할 수 있습니다.
작성자:
이주영 [비회원]
| 작성일자: 1년 전
2025-04-03 07:01:04
조회수: 101 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 101 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.