viewpager2原理和使用

近期google官网上更新了viewpager2, 支持垂直滚动, 重写之前的viewpager.
1.原理: viewpager2 内部实现原理是使用recycleview加LinearLayoutManager实现竖直滚动, 其实可以理解为对recyclerview的二次封装

源代码如下:

 private void initialize(Context context, AttributeSet attrs) {
        mRecyclerView = new RecyclerView(context) {
            @Override
            public CharSequence getAccessibilityClassName() {
                return "androidx.viewpager.widget.ViewPager";
            }

            @Override
            public void onInitializeAccessibilityEvent(@NonNull AccessibilityEvent event) {
                super.onInitializeAccessibilityEvent(event);
                event.setFromIndex(mCurrentItem);
                event.setToIndex(mCurrentItem);
            }
        };
        mRecyclerView.setId(ViewCompat.generateViewId());

        mLayoutManager = new LinearLayoutManager(context);
        mRecyclerView.setLayoutManager(mLayoutManager);
        setOrientation(context, attrs);

        mRecyclerView.setLayoutParams(
                new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        .....
        attachViewToParent(mRecyclerView, 0, mRecyclerView.getLayoutParams());
    }
2. 变化:

API变动:

  • FragmentStateAdapter替换了原来的 FragmentStatePagerAdapter
  • RecyclerView.Adapter替换了原来的 PagerAdapter
  • registerOnPageChangeCallback替换了原来的 addPageChangeListener

FragmentStateAdapter和FragmentStatePagerAdapter作用相同, 可以用viewpager来管理fragment, 区别在于viewpager2的FragmentStateAdapter与recycleview的生命周期绑定

另外viewpager2的Adapter是继承自recyclerview的adapter, 支持除了notifyDataSetChanged()以外的notifyItemChanged(int position)等方式, 使用上更加的便捷

3. 使用
  • viewpager2放在AndroidX的库中, 引用方式:
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha01'

注意: 这里是用的androidx库, 如果你的项目中还在使用support库的话, 需要将support库迁移至androidx才可以正常使用, 否则会报各种类库找不到的问题.
AndroidX适配参考文档:
https://developer.android.com/jetpack/androidx/migrate
https://www.jianshu.com/p/41de8689615d

  • xml
    

在xml中设置orientation, 或者在代码中设置setOrientation(),可以控制横纵向

  • activity中
ViewPager2 vp = findViewById(R.id.vp);
vp.setAdapter(new RecyclerView.Adapter() {
            @NonNull
            @Override
            public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
                return new ViewHolder(view);
            }

            @Override
            public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
                holder.tv.setText("position" + position);
            }

            @Override
            public int getItemCount() {
                return 3;
            }
        });

你可能感兴趣的:(viewpager2原理和使用)