需動態增減 ViewPager 頁面,自定義 PagerAdapter 需正確實現 instantiateItem、destroyItem、getCount、isViewFromObject,並處理資料變更通知。
class DynamicPagerAdapter extends PagerAdapter {
private final List views = new ArrayList<>();
// 新增頁面
public void addView(View view, int position) {
views.add(position, view);
notifyDataSetChanged(); // 關鍵:通知 ViewPager 重新查詢 getCount/instantiateItem
}
// 移除頁面
public void removeView(int position) {
views.remove(position);
notifyDataSetChanged();
}
@Override
public int getCount() {
return views.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object; // View 本身即 Object
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = views.get(position);
container.addView(view);
return view; // 返回 View 作為 Object
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
// 可選:獲取頁面標題
@Override
public CharSequence getPageTitle(int position) {
return "Page " + (position + 1);
}
}
| 方法 | 職責 | 關鍵點 |
|---|---|---|
| instantiateItem | 建立/回收頁面 View 加入容器 | 返回 View 作為 Object,供 isViewFromObject 比對 |
| destroyItem | 從容器移除頁面 | 接收 instantiateItem 返回的 Object |
| isViewFromObject | 判斷 View 是否對應 Object | 直接比較 reference (view == object) |
| getCount | 當前頁面總數 | 動態增減時必須即時反映 |
| notifyDataSetChanged | 通知資料變更 | 增減頁面後必須調用 |
ViewGroup container:即 ViewPager 本身(繼承自 ViewGroup),addView/removeView 直接操作它。startUpdate/finishUpdate,notifyDataSetChanged 內部處理。
// ViewPager2 + FragmentStateAdapter (推薦新專案)
class ScreenSlideAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
private val fragments = mutableListOf()
fun addFragment(fragment: Fragment) {
fragments.add(fragment)
notifyItemInserted(fragments.size - 1)
}
fun removeFragment(position: Int) {
fragments.removeAt(position)
notifyItemRemoved(position)
}
override fun getItemCount() = fragments.size
override fun createFragment(position: Int) = fragments[position]
}
優勢:Fragment 生命週期自動管理、記憶體優化、支援 RTL、動畫豐富、RecyclerView 底層。
理解 PagerAdapter 四大核心方法契約與 notifyDataSetChanged 觸發機制,是動態 ViewPager 穩定運作的基石。