2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

ViewPager의 페이지 전환 중에 다른 작업을 수행하려면 어떻게 하나요?

_____
Q: ViewPager의 페이지 전환 중에 다른 작업(예: 애니메이션, 데이터 로딩, UI 업데이트)을 수행하려면 어떻게 해야 하나요?

A: ViewPager의 페이지 전환 상태를 감지하여 필요한 작업을 수행하려면 `ViewPager.OnPageChangeListener` 또는 `ViewPager2.OnPageChangeCallback`을 사용하면 됩니다.

---

1. ViewPager (기존 RecyclerView 기반 아닌 경우)

```java
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// 페이지가 스크롤되는 중에 호출됨 (positionOffset: 0.0 ~ 1.0)
// 부드러운 애니메이션이나 연동 작업에 활용 가능
}

@Override
public void onPageSelected(int position) {
// 새 페이지가 완전히 선택되었을 때 호출됨
// 이 시점에 데이터 로딩 같은 작업하기 적합
}

@Override
public void onPageScrollStateChanged(int state) {
// 상태 변화:
// SCROLL_STATE_IDLE (0) - 스크롤 종료 (안 움직이고 있음)
// SCROLL_STATE_DRAGGING (1) - 사용자가 손가락을 대고 움직이고 있음
// SCROLL_STATE_SETTLING (2) - 손을 뗐고, 자동으로 정착 중
if(state == ViewPager.SCROLL_STATE_IDLE){
// 페이지 전환이 완전히 끝난 시점
// 이 타이밍에 작업 수행 가능
}
}
});
```

---

2. ViewPager2 사용 시

```java
viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
// 페이지가 이동 중일 때 호출됨
}

@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
// 새 페이지 선택 완료 시 호출
}
@Override
public void onPageScrollStateChanged(int state) {
super.onPageScrollStateChanged(state);
// 상태 변화 감지
if(state == ViewPager2.SCROLL_STATE_IDLE){
// 전환 완료 시점에 작업 수행 가능
}
}
});
```

---

핵심 포인트

- 페이지 전환 중 작업 : `onPageScrolled()` 콜백에서 페이지가 스크롤되는 동안 부드럽게 애니메이션을 연동하거나, UI 변화를 주는 작업 가능
- 페이지 전환 시작/완료 감지 : `onPageScrollStateChanged()` 메서드에서 스크롤 상태 변화를 통해 전환 시작(`SCROLL_STATE_DRAGGING`)과 종료(`SCROLL_STATE_IDLE`) 시점을 파악
- 새 페이지 선택 후 작업 : `onPageSelected()`에서 페이지가 완전히 바뀌었을 때 데이터 갱신이나 UI 변경 작업 수행 가능
- 비동기 작업 주의 : 페이지가 빠르게 전환될 경우를 대비해, 비동기 작업의 결과가 올바른 페이지에 적용되는지 검증 필요

---

예시: 페이지 전환 완료 후 데이터 로딩 수행

```java
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
boolean isPageSettling = false;

@Override
public void onPageScrollStateChanged(int state) {
if(state == ViewPager.SCROLL_STATE_SETTLING){
isPageSettling = true;
} else if(state == ViewPager.SCROLL_STATE_IDLE && isPageSettling) {
isPageSettling = false;
int currentPage = viewPager.getCurrentItem();
loadDataForPage(currentPage);
}
}

@Override
public void onPageSelected(int position) { }

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
});

private void loadDataForPage(int position){
// 페이지에 맞는 데이터 로딩 작업 수행
}
```

---

정리하면, ViewPager의 `OnPageChangeListener` 또는 ViewPager2의 `OnPageChangeCallback` 인터페이스를 활용해 페이지 전환 상태를 감지하고, 원하는 시점에 필요한 작업을 안전하게 수행하면 됩니다.
ViewPager의 페이지 전환 중에 다른 작업을 수행하려면 몇 가지 방법이 있습니다.

일반적으로 ViewPager는 페이지 상태 변화에 대한 콜백을 제공하여, 페이지가 변경될 때 특정 작업을 수행할 수 있도록 해줍니다.

아래는 이를 구현하는 방법에 대한 설명입니다.

1. `ViewPager.OnPageChangeListener` 사용하기 `ViewPager`에 `OnPageChangeListener`를 추가하면 페이지 전환 이벤트를 감지하고, 각 페이지 전환 시 특정 작업을 수행할 수 있습니다.

```java ViewPager viewPager = findViewById(R.id.viewPager); viewPager.setAdapter(yourPagerAdapter); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // 페이지가 스크롤되는 동안 동작 수행 // 예: 애니메이션 추가 } @Override public void onPageSelected(int position) { // 새 페이지가 선택되었을 때 동작 수행 // 예: 현재 페이지에 맞는 데이터 로드 } @Override public void onPageScrollStateChanged(int state) { // 페이지 스크롤 상태가 변화할 때 동작 수행 // 예: 로딩 인디케이터 표시 또는 숨기기 } }); ```

2. 비동기 작업 수행 페이지 전환 동안 비동기 작업을 수행하려면, `AsyncTask`, `Handler`, 또는 `Coroutine`(Kotlin 사용 시)을 사용할 수 있습니다.

예를 들어, 선택된 페이지에 기반하여 데이터를 로드하는 경우, 비동기 작업을 수행하여 UI 스레드를 차단하지 않도록 할 수 있습니다.

```java @Override public void onPageSelected(int position) { new LoadDataTask(position).execute(); } private class LoadDataTask extends AsyncTask { private int pagePosition; LoadDataTask(int position) { this.pagePosition = position; } @Override protected YourDataType doInBackground(Integer... params) { // 데이타 로드 작업 수행 return loadDataForPage(pagePosition); } @Override protected void onPostExecute(YourDataType result) { // 로드가 완료된 후 UI 업데이트 updateUIWithData(result); } } ```

3. RxJava나 Kotlin Coroutines 사용하기 보다 복잡한 비동기 작업이 필요한 경우, RxJava나 코틀린 코루틴을 사용하는 것이 좋습니다.

이러한 도구들은 RxJava의 Observable 또는 Kotlin의 suspend 함수를 이용하여 비동기 코드를 보다 쉽게 작성할 수 있게 해줍니다.

RxJava 예제 ```java @Override public void onPageSelected(int position) { // RxJava를 사용하여 비동기 작업 수행 Observable.fromCallable(() -> loadDataForPage(position)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::updateUIWithData); } ``` Kotlin Coroutines 예제 ```kotlin override fun onPageSelected(position: Int) { GlobalScope.launch(Dispatchers.Main) { val data = withContext(Dispatchers.IO) { loadDataForPage(position) } updateUIWithData(data) } } ```

4. 다른 UI 요소와 상호작용 페이지 전환과 동시에 다른 UI 요소와 상호작용할 수 있습니다.

예를 들어, 페이지가 전환될 때 애니메이션을 실행하거나 Toast 메시지를 표시할 수 있습니다.

```java @Override public void onPageSelected(int position) { // 다른 UI 작업 수행 Toast.makeText(context, "Page " + position + " selected", Toast.LENGTH_SHORT).show(); } ``` 이와 같이, ViewPager의 페이지 전환 중에도 다양한 작업을 수행할 수 있으며, 필요에 따라 적절한 방식을 선택하여 구현하면 됩니다.

작성자: 박서우 [비회원] | 작성일자: 1년 전 2025-04-03 07:01:10
조회수: 97 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.