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,不需要此库。