Bootstrap

ViewPager2

ViewPager2

1.什么是viewpager2

​ ViewPager2 是 Android Jetpack 中的一个组件,用于在 Android 应用中创建滑动界面。它是 ViewPager 的升级版本,提供了更强大和灵活的功能。

​ ViewPager2 是一个强大且灵活的视图容器,广泛用于 Android 应用中的页面切换场景,如引导页、图片浏览器、轮播图、选项卡等。通过 ViewPager2,可以实现流畅的滑动效果,增强用户体验,同时提供了方便的页面管理和更新能力。

2.viewpager2的特点

ViewPager2 的主要特点包括:

  1. 支持垂直和水平滑动:与 ViewPager 只支持水平滑动不同,ViewPager2 可以通过设置方向(水平或垂直)来支持不同的滑动方向。
  2. 更好的性能和动画效果:ViewPager2 使用 RecyclerView 作为其内部实现,该实现结合了 RecyclerView 的优秀性能和灵活性,可以更高效地处理大量的页面和滑动操作。
  3. 更简单的适配器:ViewPager2 不再需要 PagerAdapter,而是引入了一个名为 RecyclerView.Adapter 的新适配器类型。RecyclerView.Adapter 是 Android 官方推荐的适配器类型,相比 PagerAdapter 更加简单易用。
  4. 支持动态更新页面内容:与 ViewPager 不同,ViewPager2 允许动态地在运行时更新页面内容,以满足对页面的动态修改需求。
  5. 增强的触摸交互:ViewPager2 提供了更多的触摸和手势交互支持,包括点击、长按、拖拽和滑动事件等。

3.viewpager2的使用

利用循环适配器搭配viewPager2

  1. 在布局文件中添加 ViewPager2 组件:
<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager2"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  1. 在代码中初始化 ViewPager2:
ViewPager2 viewPager2 = findViewById(R.id.viewPager2);
  1. 创建一个适配器(Adapter)来提供页面的内容:
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    // 在这里实现适配器逻辑

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 创建并返回 ViewHolder
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        // 绑定数据到 ViewHolder
    }

    @Override
    public int getItemCount() {
        // 返回页面数量
    }
}

public class MyViewHolder extends RecyclerView.ViewHolder {
    // 在这里定义 ViewHolder 的元素

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        // 初始化 ViewHolder 的元素
    }
}
  1. 将适配器设置给 ViewPager2:
MyAdapter adapter = new MyAdapter();
viewPager2.setAdapter(adapter);

ViewPager2 已经设置好,在 MyAdapter中添加数据即可

利用翻页适配器搭配viewPager2

  1. 在布局文件中添加 ViewPager2 组件:
<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager2"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  1. 创建一个 Fragment 继承自 Fragment 类。例如,创建一个名为 MyFragment 的 Fragment。
public class MyFragment extends Fragment {
    // 在这里实现 Fragment 的逻辑

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 加载布局文件
        View view = inflater.inflate(R.layout.fragment_my, container, false);
        // 初始化页面布局
        // 可以在这里查找并设置页面中的视图元素

        return view;
    }
}
  1. 在代码中初始化 ViewPager2:
ViewPager2 viewPager2 = findViewById(R.id.viewPager2);
  1. 创建一个 FragmentStateAdapter 适配器来提供 Fragment 列表:
public class MyAdapter extends FragmentStateAdapter {
    private List<Fragment> fragmentList;

    public MyAdapter(FragmentManager fragmentManager, List<Fragment> fragmentList) {
        super(fragmentManager, getLifecycle());
        this.fragmentList = fragmentList;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        // 返回指定位置的 Fragment
        return fragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        // 返回 Fragment 的数量
        return fragmentList.size();
    }
}
  1. 创建 Fragment 列表,并将它们添加到适配器中:
List<Fragment> fragmentList = new ArrayList<>();
fragmentList.add(new MyFragment());
fragmentList.add(new AnotherFragment());

MyAdapter adapter = new MyAdapter(getSupportFragmentManager(), fragmentList);
viewPager2.setAdapter(adapter);

viewPager2+tabLauout

viewPager2经常跟标签栏搭配,一旦监听到翻页事件就切换标签

  1. 在布局文件中添加 TabLayout 和 ViewPager2 组件:
<com.google.android.material.tabs.TabLayout
    android:id="@+id/tabLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabMode="scrollable"
    app:tabGravity="center" />

<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager2"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  1. 在代码中初始化 TabLayout 和 ViewPager2:
TabLayout tabLayout = findViewById(R.id.tabLayout);
ViewPager2 viewPager2 = findViewById(R.id.viewPager2);
  1. 创建一个 Fragment 继承自 Fragment 类。例如,创建一个名为 MyFragment 的 Fragment。
public class MyFragment extends Fragment {
    // 在这里实现 Fragment 的逻辑

    // 省略其他代码...
}
  1. 在代码中创建 Fragment 列表:
List<Fragment> fragmentList = new ArrayList<>();
fragmentList.add(new MyFragment());
fragmentList.add(new AnotherFragment());
  1. 创建一个 FragmentStateAdapter 适配器来提供 Fragment 列表:
public class MyAdapter extends FragmentStateAdapter {
    private List<Fragment> fragmentList;

    public MyAdapter(FragmentManager fragmentManager, Lifecycle lifecycle, List<Fragment> fragmentList) {
        super(fragmentManager, lifecycle);
        this.fragmentList = fragmentList;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        // 返回指定位置的 Fragment
        return fragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        // 返回 Fragment 的数量
        return fragmentList.size();
    }
}
  1. 将适配器设置给 ViewPager2:
MyAdapter adapter = new MyAdapter(getSupportFragmentManager(), getLifecycle(), fragmentList);
viewPager2.setAdapter(adapter);
  1. 将 TabLayout 与 ViewPager2 绑定:
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> {
    // 设置标签页标题
    tab.setText("Tab " + (position + 1));
});
tabLayoutMediator.attach();

循环适配器和翻页适配器什么时候使用?

使用循环适配器或翻页适配器取决于你的需求以及页面之间的关系。下面是一些指导原则:

  1. 使用循环适配器:

    当你希望在 ViewPager2 中循环滑动页面时,可以使用循环适配器。循环适配器会在最后一页后面自动添加第一页,以便实现无限循环滑动的效果。

  2. 使用翻页适配器:

    当你的页面数量较大或者有动态加载页面的需求时,可以使用翻页适配器。翻页适配器会自动销毁不需要的页面,以节省内存和提高性能。

综上所述,循环适配器适用于页面数量较少且需要循环滑动的情况,而翻页适配器适用于页面数量较多或需要动态加载的情况。根据你的具体需求选择适合的适配器。

;