• 展开说说:Android Fragment完全解析-卷二


    书接上回,说一下fragment搭配Viewpager的使用。

    1. 是什么

    Fragment已经在卷一整理过了,这里说一下ViewPager,ViewPager是一个可以左右滑动的容器组件,继承自ViewGroup。一般是用在首页banner和详情页的轮播图展示、APP首次使用的新手引导页、还可以在APP首页和Fragment搭配使用。本篇分析fragment搭配Viewpager的使用。

    1. 怎么用

    Viewpager需要和Adaper配合使用,通过viewPager.setAdapter(pagerAdapter);

    方法可知要传入一个PagerAdapter对象。

    三个重要方法:

    (1)public void setAdapter(@Nullable PagerAdapter adapter) : 设置ViewPager的适配器。

    (2)public void addOnPageChangeListener(@NonNull OnPageChangeListener listener):

    设置页面改变事件监听器,可以监听当前页面所在的索引,以及页面滑动具体位置,下面细说。

    (3)public void setCurrentItem(int item) :可以设置viewpager显示第几个元素,可以是第几个图片或者fragment。

    2.1新建adapter,写一个类继承PagerAdapter

    1. //fragment切换的Viewpageadapter
    2. public class MyPagerAdapter extends FragmentPagerAdapter {
    3.     private List fragments=new ArrayList<>();
    4.     private FragmentManager fm;
    5.     public MyPagerAdapter(FragmentManager fm , List fragments) {
    6.         super(fm);
    7.         this.fm=fm;
    8.         this.fragments.clear();
    9.         this.fragments.addAll(fragments);
    10.     }
    11.     @Override
    12.     public Fragment getItem(int position) {
    13.         return fragments.get(position);
    14.     }
    15.     @Override
    16.     public int getCount() {
    17.         return fragments.size();
    18.     }
    19. }

    这里补充一下PagerAdapter是个抽象类,FragmentPagerAdapter FragmentStatePagerAdapter都是它的两个实现类。

    FragmentPagerAdapter加载Fragment内存开销比较大,但页面切换比较丝滑;FragmentStatePagerAdapter内存占用少,页面切换效果略逊一筹。我这里就四个Fragment因此用了FragmentPagerAdapter,应用开发中请大家根据实际情况选择。

    2.2 准备fragment并设置Adapter

    1. fragmentHome = new FragmentHome();
    2. fragmentApp = new FragmentApp();
    3. fragmentMsg = new FragmentMsg();
    4. fragmentMy = new FragmentMy();
    5. //使用Viewpage切换
    6. fragments.add(fragmentHome);
    7. fragments.add(fragmentApp);
    8. fragments.add(fragmentMsg);
    9. fragments.add(fragmentMy);
    10. MyPagerAdapter pagerAdapter = new MyPagerAdapter(manager, fragments);
    11. viewPager.setAdapter(pagerAdapter);
    12. pagerAdapter.notifyDataSetChanged();

    2.3 在Activity的onCreate中设置完adapter以后,展示首页Activity时切换到第一个fragment

    //借助Viewpage切换fragment
    viewPager.setCurrentItem(0);

    2.4设置监听方法

    1. viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    2.     @Override
    3.     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    4.         Log.e(TAG, "viewPager-onPageScrolled: position=" + position + "   positionOffset=" + positionOffset + "   positionOffsetPixels=" + positionOffsetPixels);
    5.     }
    6.     @Override
    7.     public void onPageSelected(int position) {
    8.         Log.e(TAG, "viewPager-onPageSelected: position= " + position);
    9.         viewPager.setCurrentItem(position);
    10.     }
    11.  
    12.     @Override
    13.     public void onPageScrollStateChanged(int state) {
    14.         Log.e(TAG, "viewPager-onPageScrollStateChanged:  state=" + state);
    15.     }
    16. });

    3、啥原理

    3.1 ViewPager为什么可以滑动?

    因为ViewPager重写了View类的computeScroll方法,并在computeScroll中调用onPageScrolled并且里还调用了view的scrollTo实现view滑动,重写view中的这个方法,computeScroll和scrollTo配合专门负责实现滑动的
         

    3.2再说三个关键回调方法

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)页面滚动的所以和坐标变化

    public void onPageSelected(int position) 一次完整滑动结束以后这个方法返回当前索引,上面的例子时在这里调用 viewPager.setCurrentItem(position);切换了fragment,其实引导页或者详情页轮播图切换时当前页码或者底部小圆点都时在这里进行切换。

    public void onPageScrollStateChanged(int state)页面的滑动状态,定义了几个常量值:

       /**
         *       * Indicates that the pager is in an idle, settled state. The current page
         *      * is fully in view and no animation is in progress.
         *      public static final int SCROLL_STATE_IDLE = 0; //滑动停止
         *
         *      * Indicates that the pager is currently being dragged by the user.
         *      public static final int SCROLL_STATE_DRAGGING = 1;  //开始滑动
         *
         *      * Indicates that the pager is in the process of settling to a final position.
         *      public static final int SCROLL_STATE_SETTLING = 2;  //正在滑动
         */

    个人总结记录,才疏学浅,如有错误,欢迎指正,多谢。 

  • 相关阅读:
    k8s deployment讲解
    喜报 | 人大金仓荣获2023“金鼎奖”,金融系统解决方案再获认可
    Flask四种配置方式
    使用xshell linux安装nodejs,CentOS下安装并配置nodejs环境教程
    加载器、反射、xml、DTD、schema、注解、单元测试
    FIX三天日记-quick fix简介
    【PAT甲级】1084 Broken Keyboard
    华为数字能源,开启超充新纪元
    vue 子组件向父组件传递参数 子传父
    相机相关:相机模型与畸变模型
  • 原文地址:https://blog.csdn.net/Hidanchaofan/article/details/138047990