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

ViewPager에서 동적으로 페이지를 추가하거나 제거하는 방법은?

_____
Q1: ViewPager에서 동적으로 페이지를 추가하거나 제거하려면 어떻게 해야 하나요?
A1: ViewPager는 기본적으로 어댑터를 통해 화면에 표시할 페이지를 관리하므로, 페이지를 동적으로 추가하거나 제거하려면 어댑터가 관리하는 데이터 목록을 수정한 후, 어댑터에 변경 사항을 알리는 메서드를 호출해야 합니다.

---

Q2: 어떤 어댑터를 사용해야 동적 페이지 관리를 쉽게 할 수 있나요?
A2: `FragmentStatePagerAdapter` 또는 `FragmentStateAdapter`(ViewPager2 사용 시)를 사용하는 것이 좋습니다. 이 어댑터들은 동적 데이터 변경에 유연하며, 메모리 관리도 효율적이기 때문입니다.

---

Q3: 동적으로 페이지를 추가하는 기본적인 절차는?
A3:
1. 어댑터가 참조하는 데이터 리스트에 새 페이지의 데이터를 추가한다.
2. 어댑터의 `notifyDataSetChanged()`를 호출하여 데이터 변경을 알린다.
3. 필요에 따라 ViewPager의 현재 페이지를 새로 업데이트된 페이지로 설정할 수 있다.

---

Q4: 동적으로 페이지를 제거하는 방법은?
A4:
1. 어댑터의 데이터 리스트에서 해당 페이지 데이터를 삭제한다.
2. `notifyDataSetChanged()`로 데이터 변경을 알려 ViewPager를 갱신한다.
3. 현재 페이지가 삭제된 페이지와 같거나 이후 페이지라면, 적절히 `setCurrentItem()`을 호출해 현재 페이지 위치를 조정한다.

---

Q5: `notifyDataSetChanged()` 호출만으로 페이지가 제대로 갱신되나요?
A5: 기본 `PagerAdapter`는 `notifyDataSetChanged()` 호출 시 모든 페이지를 재구성하지 않을 수 있습니다.
- `FragmentStatePagerAdapter`를 사용할 경우, `getItemPosition(Object object)` 메서드를 오버라이드하여 다음과 같이 작성하면 변경된 페이지가 올바르게 갱신됩니다.

```java
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE; // 모든 페이지를 다시 생성하도록 강제
}
```

---

Q6: ViewPager2에서 동적 페이지 추가/제거는 어떻게 하나요?
A6: ViewPager2는 RecyclerView 기반이므로 어댑터가 RecyclerView.Adapter를 상속받았습니다.
- 데이터 리스트를 변경 후 `notifyItemInserted()` / `notifyItemRemoved()` 메서드를 호출하여 부분 갱신을 할 수 있습니다.
- 전체 변경 시는 `notifyDataSetChanged()`를 호출합니다.

---

Q7: 정리하면, 동적 페이지 추가/삭제 시 필수 단계는?
A7:
1. 어댑터가 참조하는 데이터 셋을 변경한다 (추가 또는 삭제).
2. 어댑터에 데이터 변경을 알린다 (`notifyDataSetChanged()` 또는 부분 갱신 메서드 사용).
3. 필요하면 ViewPager의 현재 페이지 위치를 조정한다 (`setCurrentItem()`).

---

Q8: 예시 코드 (FragmentStatePagerAdapter 사용 시 동적 페이지 추가)

```java
public class MyPagerAdapter extends FragmentStatePagerAdapter {
private final List fragments = new ArrayList<>();

public MyPagerAdapter(@NonNull FragmentManager fm) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}

public void addPage(Fragment fragment) {
fragments.add(fragment);
notifyDataSetChanged();
}

public void removePage(int position) {
if (position >= 0 && position < fragments.size()) {
fragments.remove(position);
notifyDataSetChanged();
}
}

@NonNull
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}

@Override
public int getCount() {
return fragments.size();
}

@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE; // 변경된 페이지를 재구성하도록 함
}
}
```

---

위와 같이 ViewPager 어댑터 내부 데이터 관리 및 notifyDataSetChanged() 호출을 통해 동적으로 페이지를 추가하거나 제거할 수 있습니다. ViewPager2를 쓸 경우에는 RecyclerView.Adapter 방식으로 데이터 및 알림 처리만 적절히 하면 됩니다.
ViewPager에서 동적으로 페이지를 추가하거나 제거하는 방법은 ViewPager와 연결된 어댑터를 통해 이루어집니다.

여기서는 Android의 ViewPager2를 사용한다고 가정하고, 일반적인 절차를 설명하겠습니다.

ViewPager2는 이전 버전인 ViewPager보다 더 많은 기능과 성능 개선을 제공합니다.

1. 필요한 라이브러리 추가 먼저, `build.gradle` 파일에 ViewPager2 의존성을 추가합니다: ```groovy dependencies { implementation "androidx.viewpager2:viewpager2:1.0.0" } ```

2. ViewPager2 및 RecyclerView.Adapter 설정 ViewPager2는 RecyclerView.Adapter를 사용합니다.

따라서 먼저 어댑터를 설정해야 합니다.

Adapter 클래스 작성 ```kotlin class MyPagerAdapter(private val items: MutableList) : RecyclerView.Adapter() { class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val textView: TextView = itemView.findViewById(R.id.textView) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.textView.text = items[position] } override fun getItemCount(): Int = items.size fun addItem(item: String) { items.add(item) notifyItemInserted(items.size - 1) } fun removeItem(position: Int) { if (position >= 0 && position < items.size) { items.removeAt(position) notifyItemRemoved(position) } } } ``` 이 어댑터는 간단한 리스트 아이템을 포함하고 있으며, `addItem` 및 `removeItem` 메소드를 사용하여 리스트를 조작할 수 있습니다.



3. ViewPager2 설정 Activity 또는 Fragment에서 ViewPager2를 설정합니다.

```kotlin class MyActivity : AppCompatActivity() { private lateinit var viewPager: ViewPager2 private lateinit var adapter: MyPagerAdapter private val items = mutableListOf() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewPager = findViewById(R.id.viewPager) adapter = MyPagerAdapter(items) viewPager.adapter = adapter // 예제 데이터 추가 addNewPage("Page 1") addNewPage("Page 2") } private fun addNewPage(title: String) { adapter.addItem(title) } private fun removePage(position: Int) { adapter.removeItem(position) } } ```

4. 페이지 추가 및 제거 `addNewPage` 메소드를 호출하여 페이지를 추가하고, `removePage` 메소드를 통해 특정 페이지를 제거합니다.

예를 들어 버튼 클릭 시 페이지를 추가하거나 제거할 수 있습니다.



5. UI 반영 페이지를 추가하거나 제거할 때 `notifyItemInserted` 및 `notifyItemRemoved` 메소드를 호출하여 RecyclerView의 데이터 변경을 UI에 반영합니다.

예제 UI Layout ```xml ``` 이로써 ViewPager2에서 동적으로 페이지를 추가하거나 제거하는 기본적인 방법을 구현할 수 있습니다.

필요한 경우 더 복잡한 데이터 구조나 사용자 정의 레이아웃을 추가하여 확장할 수 있습니다.

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