本文共 3238 字,大约阅读时间需要 10 分钟。
ViewPager2 是 Google 在 Android 组件包中新增的替代 ViewPager 组件,旨在解决前一个版本中的主要痛点。当前已发布两个 Alpha 版本,该文档将详细介绍 ViewPager2 的功能、使用方法及与前一个版本的区别,并提供实际代码示例。
为了使用 ViewPager2,需要在项目依赖中添加相应的库文件。
implementation "androidx.viewpager2:viewpager2:1.0.0-alpha02"
接下来,在 XML 文件中声明 ViewPager2 组件。在 HorizontalScrollingActivity 中的 layout 文件中添加:
oston.xml
水平滚动是 ViewPager2 的默认配置方式。在代码中,可以通过设置 layout 文件中的 ViewPager2 组件来实现,默认即可支持水平滚动。
创建简单的 Page 项布局 item_page.xml:
```xml如果需要垂直滚动,只需在 Activity 类中调用简单的方法即可。
viewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
就能实现竖直方向的滚动效果。如此简洁的实现方式,远胜过传统做法需要依赖第三方库或自行实现的方式。
ViewPager2 现在支持 FragmentStateAdapter,相比于旧的 FragmentPagerAdapter,新增了许多优化。以下是一个简单的示例。
创建 PageFragment 类,接收两个参数并展示内容:
```javapublic class PageFragment extends Fragment { private static final StringExtra COLORS = "colors"; private static final StringExtra POSITION = "position";public static PageFragment newInstance(Listcolors, int position) { Bundle args = new Bundle(); args.putSerializable(COLORS, colors); args.putInt(POSITION, position); PageFragment fragment = new PageFragment(); fragment.setArguments(args); return fragment;}private List mColors;private int mPosition;@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { Bundle args = getArguments(); mColors = (List ) args.getSerializable(COLORS); mPosition = args.getInt(POSITION); }}@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.item_page, container, false);}@Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); RelativeLayout container = view.findViewById(R.id.container); TextView tvTitle = view.findViewById(R.id.tvTitle); tvTitle.setText("Item " + mPosition); container.setBackgroundResource(mColors.get(mPosition));}
}
创建 FragmentStateAdapter 类,并在 Activity 中使用:
```javapublic class ViewPagerFragmentStateAdapter extends FragmentStateAdapter { public ViewPagerFragmentStateAdapter(@NonNull FragmentManager fragmentManager) { super(fragmentManager); } @NonNull @Override public Fragment getItem(int position) { return PageFragment.newInstance(colors, position); } @Override public int getItemCount() { return colors.size(); }}
如需在页面内容发生变化时通知适配器,可以按照以下步骤实现。
```java@Overridepublic boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_add: colors.add(android.R.color.holo_red_light); mAdapter.notifyItemInserted(colors.size() - 1); break; case R.id.action_remove: int last = colors.size() - 1; colors.remove(last); mAdapter.notifyItemRemoved(last); break; } return super.onOptionsItemSelected(item);}```目前的 ViewPager2 正在 Alpha 阶段,还存在一些潜在问题,建议在正式应用前进行充分测试。