ViewPager2:横向翻页容器 · AndroidX 源码指南
AAndroidX 源码指南
View 体系
View 体系 · androidx.core

ViewPager2:横向翻页容器Core 1.20.0-alpha01

RecyclerView 适配器、页面回调、假拖拽与方向设置。

最后更新 2026-08-01

复制即用

<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

代码:

import androidx.viewpager2.widget.ViewPager2;

ViewPager2 pager = findViewById(R.id.view_pager);
pager.setAdapter(new FragmentStateAdapter(this) {
    @Override
    public Fragment createFragment(int position) {
        return PageFragment.newInstance(position);
    }
});

// 页面变化监听
pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
    @Override
    public void onPageSelected(int position) {}
});

// 跳转
pager.setCurrentItem(2, true); // 带动画
pager.setOrientation(ViewPager2.ORIENTATION_VERTICAL); // 竖向

翻页联动效果(PageTransformer)

CompositePageTransformer transformer = new CompositePageTransformer();
transformer.addTransformer(new MarginPageTransformer(16));
transformer.addTransformer((page, position) -> {
    // position: 0 当前页,±1 相邻页
    page.setAlpha(1f - Math.abs(position) * 0.3f);
    page.setScaleX(1f - Math.abs(position) * 0.1f);
    page.setScaleY(1f - Math.abs(position) * 0.1f);
});
pager.setPageTransformer(transformer);

自动轮播(FakeDrag)

pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
    @Override
    public void onPageSelected(int position) {
        current = position;
    }
});

handler.postDelayed(new Runnable() {
    @Override public void run() {
        pager.beginFakeDrag();
        pager.fakeDragBy(-pager.getWidth() * 0.5f); // 模拟拖动
        pager.endFakeDrag();
        handler.postDelayed(this, 3000);
    }
}, 3000);

常见陷阱

  • getCurrentItem() 时机:在 onPageSelected 中读取才是稳定值。
  • 数据变更后 notifyDataSetChanged:ViewPager2 需要 getItemId/containsItem 配合(FragmentStateAdapter)。
  • 嵌套滚动:竖向 ViewPager2 与 RecyclerView 冲突要处理。
  • Compose 优先 HorizontalPager:不需要此库。

要点

  • 适配器:RecyclerView.Adapter(Fragment 用 FragmentStateAdapter)。
  • 内置 CompositePageTransformer 可做缩放/透明度联动(MarginPageTransformer 等)。
  • FakeDrag 支持编程模拟拖拽(配合自动轮播)。
  • getCurrentItem()onPageSelected 中读取才是稳定值。
  • Compose 中优先使用 HorizontalPager,不需要此库。

相关页面