展开说说: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

//fragment切换的Viewpageadapter
public class MyPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragments=new ArrayList<>();
    private FragmentManager fm;
    public MyPagerAdapter(FragmentManager fm , List<Fragment> fragments) {
        super(fm);
        this.fm=fm;
        this.fragments.clear();
        this.fragments.addAll(fragments);
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

}

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

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

2.2 准备fragment并设置Adapter

fragmentHome = new FragmentHome();
fragmentApp = new FragmentApp();
fragmentMsg = new FragmentMsg();
fragmentMy = new FragmentMy();


//使用Viewpage切换
fragments.add(fragmentHome);
fragments.add(fragmentApp);
fragments.add(fragmentMsg);
fragments.add(fragmentMy);



MyPagerAdapter pagerAdapter = new MyPagerAdapter(manager, fragments);
viewPager.setAdapter(pagerAdapter);

pagerAdapter.notifyDataSetChanged();

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

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

2.4设置监听方法

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        Log.e(TAG, "viewPager-onPageScrolled: position=" + position + "   positionOffset=" + positionOffset + "   positionOffsetPixels=" + positionOffsetPixels);
    }

    @Override
    public void onPageSelected(int position) {
        Log.e(TAG, "viewPager-onPageSelected: position= " + position);
        viewPager.setCurrentItem(position);
    }

 
    @Override
    public void onPageScrollStateChanged(int state) {
        Log.e(TAG, "viewPager-onPageScrollStateChanged:  state=" + state);
    }
});

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;  //正在滑动
     */

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

相关推荐

  1. 展开说说:Android Fragment完全解析-

    2024-04-22 00:28:02       40 阅读
  2. 展开说说provide和inject

    2024-04-22 00:28:02       46 阅读
  3. 完全背包总结

    2024-04-22 00:28:02       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 00:28:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 00:28:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 00:28:02       87 阅读
  4. Python语言-面向对象

    2024-04-22 00:28:02       96 阅读

热门阅读

  1. vue大屏

    2024-04-22 00:28:02       32 阅读
  2. jQuery 选择器有几种,分别是什么

    2024-04-22 00:28:02       34 阅读
  3. Linux系统的账号和权限管理

    2024-04-22 00:28:02       36 阅读
  4. 赠品:跳动的心

    2024-04-22 00:28:02       36 阅读
  5. ZYNQ-700呼吸灯

    2024-04-22 00:28:02       36 阅读
  6. 【设计模式】8、adapter 适配器模式

    2024-04-22 00:28:02       32 阅读
  7. 考古:MFC界面的自适应缩放(代码示例)

    2024-04-22 00:28:02       37 阅读
  8. Leetcode 104. 二叉树的最大深度

    2024-04-22 00:28:02       35 阅读