今天学ViewPager2

3,006 阅读1分钟

ViewPager2简介

距离ViewPager2正式版发布已经有将近一个月的时间,我们一起来看看吧。

ViewPager2是为了解决ViewPager,包括从右到左的布局支持、垂直方向、可修改的Fragment等一些痛点

核心方法

从源码来看,ViewPager2核心是通过RecyclerViewLinearLayoutManager实现的,看到这里已经看破了,在没有ViewPager2的时候,我们就经常使用RecyclerView来实现轮播图,这次算是官方给你实现了。

再一个就是PagerSnapHelper了。

PagerSnapHelper是继承自SnapHelper的。用于辅助RecyclerView在滚动结束时将Item对齐到某个位置,特别是列表横向滑动时,很多时候不会让列表滑到任意位置,而是会有一定的规则限制,这时候就可以通过SnapHelper来定义对齐规则了。

具体关于SnapHelper的原理可以参考这位大佬的文章,点这里

常用Api

  • 添加修饰线
    • void addItemDecoration(RecyclerView.ItemDecoration decor)
  • 添加修饰线(index:如果此值为负,则将在末尾添加装饰。)
    • void addItemDecoration(RecyclerView.ItemDecoration decor, int index)
  • 开始模拟滑动
    • void beginFakeDrag()
  • 结束模拟滑动
    • endFakeDrag()
  • 设置滑动方向(垂直/水平)
    • void setOrientation(int orientation)
  • 禁止滑动
    • void setUserInputEnabled(boolean enabled)
  • 获取当前页面
    • int getCurrentItem()
  • 设置显示页面
    • void setCurremt(int item)
  • 获取适配器
    • getAdapter()
  • 设置缓存
    • setOffscreenPageLimit(int limit)
  • 设置ViewPager的切换动画
    • setPageTransformer(ViewPager2.PageTransformer transformer)
  • 页面回调(同addPageChangeListener
    • registerOnPageChangeCallback(OnPageChangeCallback).
  • 删除回调
    • unregisterOnPageChangeCallback(ViewPager2.OnPageChangeCallback callback)

同时,ViewPager2还支持局部刷新

notifyDataSetChanged();
notifyItemChanged(int position)

使用

    @Override
    public void onClick(View v) {
            case R.id.vertical:
                mViewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
                break;
            case R.id.horizontal:
                mViewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
                break;
            case R.id.userScroll:
                mViewPager2.setUserInputEnabled(!isChecked);
                break;
            case R.id.rotateCheckBox:
                //旋转
                mViewPager2.requestTransform();
                break;
            case R.id.translateCheckBox:
                //平移
                mViewPager2.requestTransform();
                break;
            case R.id.scaleCheckBox:
                //缩放
                mViewPager2.requestTransform();
                break;
        }
    }

欢迎讨论!