【Android】ViewPager基本用法总结

打印 上一主题 下一主题

主题 835|帖子 835|积分 2505

ViewPager 是 Android 中一个用于在同一屏幕上滑动不同页面(通常是左右滑动)的组件。它通常用于实现多页面滑动效果,好比应用的引导页、图片轮播、以及支持标签导航的界面。
  ViewPager 与 PagerAdapter 联合使用。PagerAdapter 是一个适配器,它负责为 ViewPager 提供页面内容。每个页面通常是一个 Fragment,也可以是一个普通的 View。
   特点:
  

  • 滑动效果:ViewPager 答应用户通过滑动手势在不同页面之间切换。
  • 缓存页面:默认环境下,ViewPager 会缓存当前页面的前一页和后一页,以进步 滑动性能。
  • 与TabLayout联合:ViewPager 经常与 TabLayout 配合使用,实现顶部标签栏导航。
  一、添加ViewPager控件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:id="@+id/main"
  6.     android:layout_width="match_parent"
  7.     android:layout_height="match_parent"
  8.     tools:context=".MainActivity">
  9.     <androidx.viewpager.widget.ViewPager
  10.         android:id="@+id/viewPager"
  11.         android:layout_width="match_parent"
  12.         android:layout_height="match_parent" />
  13. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
二、构建适配器类


继承PagerAdapter并实现4个方法:
getCount,destroyItem,instantiateItem,isViewFromObject
  1. public class MyViewPagerAdapter extends PagerAdapter {
  2.     @Override
  3.     public int getCount() {
  4.         return 0;
  5.     }
  6.     @Override
  7.     public void destroyItem(@NonNull View container, int position, @NonNull Object object) {
  8.         super.destroyItem(container, position, object);
  9.     }
  10.     @NonNull
  11.     @Override
  12.     public Object instantiateItem(@NonNull View container, int position) {
  13.         return super.instantiateItem(container, position);
  14.     }
  15.     @Override
  16.     public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
  17.         return false;
  18.     }
  19. }
复制代码

三、在 MainActivity 中设置适配器

示例一:图片切换

适配器

  1. public class MyViewPagerAdapter extends PagerAdapter {
  2.     List<ImageView> mImageViewList;
  3.     public MyViewPagerAdapter(List<ImageView> mImageViewList) {
  4.         this.mImageViewList = mImageViewList;
  5.     }
  6.     @Override
  7.     public int getCount() {
  8.         return mImageViewList == null ? 0 : mImageViewList.size();
  9.     }
  10.     @Override
  11.     public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
  12.         return view == object;
  13.     }
  14.     @NonNull
  15.     @Override
  16.     public Object instantiateItem(@NonNull ViewGroup container, int position) {
  17.         container.addView(mImageViewList.get(position));
  18.         return mImageViewList.get(position);
  19.     }
  20.     // 该方法需删除super方法,否则会报错闪退
  21.     @Override
  22.     public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
  23.         container.removeView((View) object);
  24.     }
  25. }
复制代码
MainActivity

  1. public class MainActivity extends AppCompatActivity {
  2.     private MyViewPagerAdapter myViewPagerAdapter;
  3.     private ViewPager viewPager;
  4.     List<ImageView> imageViewsList;
  5.     @Override
  6.     protected void onCreate(@Nullable Bundle savedInstanceState) {
  7.         super.onCreate(savedInstanceState);
  8.         setContentView(R.layout.activity_main);
  9.         viewPager = findViewById(R.id.viewPager);
  10.         initData();
  11.         myViewPagerAdapter = new MyViewPagerAdapter(imageViewsList);
  12.         viewPager.setAdapter(myViewPagerAdapter);
  13.         viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  14.             @Override
  15.             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  16.             }
  17.             @Override
  18.             public void onPageSelected(int position) {
  19.                 Toast.makeText(MainActivity.this, "当前页面为:" + (position + 1), Toast.LENGTH_SHORT).show();
  20.             }
  21.             @Override
  22.             public void onPageScrollStateChanged(int state) {
  23.             }
  24.         });
  25.     }
  26.     private void initData() {
  27.         ImageView imageView1 = new ImageView(this);
  28.         imageView1.setImageResource(R.drawable.p1);
  29.         ImageView imageView2 = new ImageView(this);
  30.         imageView2.setImageResource(R.drawable.p2);
  31.         ImageView imageView3 = new ImageView(this);
  32.         imageView3.setImageResource(R.drawable.p3);
  33.         imageViewsList = new ArrayList<>();
  34.         imageViewsList.add(imageView1);
  35.         imageViewsList.add(imageView2);
  36.         imageViewsList.add(imageView3);
  37.     }
  38. }
复制代码

示例二:Fragment切换

适配器

与图片类似,List存储的为Fragment,并且自界说适配器类继承FragmentPagerAdapter
只用实现两个方法getItem,getCount
  1. public class MyFragmentVPAdapter extends FragmentPagerAdapter {
  2.     List<Fragment> myFragmentList;
  3.     public MyFragmentVPAdapter(@NonNull FragmentManager fm, List<Fragment> fragmentList) {
  4.         super(fm);
  5.         this.myFragmentList = fragmentList;
  6.     }
  7.     @NonNull
  8.     @Override
  9.     public Fragment getItem(int position) {
  10.         return myFragmentList == null ? null : myFragmentList.get(position);
  11.     }
  12.     @Override
  13.     public int getCount() {
  14.         return myFragmentList == null ? 0 : myFragmentList.size();
  15.     }
  16. }
复制代码
Fragment

这里省略部门代码和fragment的layout,只放了一个TextView
这里通过param1参数传递信息来设置fragment样式
  1. public class VPFragment extends Fragment {
  2.     private static final String ARG_PARAM1 = "param1";
  3.     private static final String ARG_PARAM2 = "param2";
  4.     private String mParam1;
  5.     private String mParam2;
  6.     private TextView textView;
  7.    
  8.     public static VPFragment newInstance(String param1, String param2) {
  9.         VPFragment fragment = new VPFragment();
  10.         Bundle args = new Bundle();
  11.         args.putString(ARG_PARAM1, param1);
  12.         args.putString(ARG_PARAM2, param2);
  13.         fragment.setArguments(args);
  14.         return fragment;
  15.     }
  16.     @Override
  17.     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
  18.         super.onViewCreated(view, savedInstanceState);
  19.         
  20.         textView = view.findViewById(R.id.tv);
  21.         textView.setText(mParam1);
  22.     }
  23. }
复制代码
MainActivity

  1. public class MainActivity extends AppCompatActivity {
  2.     // 声明 ViewPager 和自定义 Fragment 适配器
  3.     private ViewPager viewPager;
  4.     private MyFragmentVPAdapter mFragmentVPAdapter;
  5.     List<Fragment> mFragmentList; // 存储 Fragment 的列表
  6.     @Override
  7.     protected void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         setContentView(R.layout.activity_main);
  10.         // 绑定布局文件中的 ViewPager 控件
  11.         viewPager = findViewById(R.id.viewPager);
  12.         // 初始化 Fragment 数据
  13.         initData();
  14.         // 创建适配器实例并将其设置给 ViewPager
  15.         mFragmentVPAdapter = new MyFragmentVPAdapter(getSupportFragmentManager(), mFragmentList);
  16.         viewPager.setAdapter(mFragmentVPAdapter);
  17.         // 为 ViewPager 添加页面变化监听器
  18.         viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  19.             @Override
  20.             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  21.                 // 当页面正在滑动时调用,可以获取滑动的进度
  22.             }
  23.             @Override
  24.             public void onPageSelected(int position) {
  25.                 // 当新页面被选中时调用,显示当前页面索引的 Toast
  26.                 Toast.makeText(MainActivity.this, "这是碎片" + (position + 1), Toast.LENGTH_SHORT).show();
  27.             }
  28.             @Override
  29.             public void onPageScrollStateChanged(int state) {
  30.                 // 当页面滑动状态改变时调用,比如静止、拖动、自动滑动状态
  31.             }
  32.         });
  33.     }
  34.     // 初始化 Fragment 列表的方法
  35.     private void initData() {
  36.         mFragmentList = new ArrayList<>(); // 创建一个存储 Fragment 的列表
  37.         // 创建并初始化多个 VPFragment 实例,每个 Fragment 对应一个页面
  38.         VPFragment vpFragment1 = VPFragment.newInstance("这是碎片1", "");
  39.         VPFragment vpFragment2 = VPFragment.newInstance("这是碎片2", "");
  40.         VPFragment vpFragment3 = VPFragment.newInstance("这是碎片3", "");
  41.         // 将 Fragment 添加到列表中
  42.         mFragmentList.add(vpFragment1);
  43.         mFragmentList.add(vpFragment2);
  44.         mFragmentList.add(vpFragment3);
  45.     }
  46. }
复制代码


感谢您的阅读
如有错误烦请指正


   参考:
  

  • 36.3-ViewPager联合Fragment_哔哩哔哩_bilibili

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表