ViewPager2 入门学习

ViewPager2 从出来到现在已经有一段时间了,它修复了 ViewPager 常见的一些 bug,以及支持竖直方法和 RTL , 现在很多小伙伴已经开始使用上了。那么,学不懂也要学。

一、使用

首先,你的工程必须支持 androidx,我觉得新开的工程都可以使用 androidx了,一些主流的第三方库也都支持,而且 google 也说28以后,不再支持 support 库,当然这个看个人。
关联 viewpager2:

 implementation "androidx.viewpager2:viewpager2:1.0.0"

它 的使用与 ViewPager 没多大区别。首先在 xml 中写上布局:

  <androidx.viewpager2.widget.ViewPager2
      android:id="@+id/page"
      android:layout_width="match_parent"
      android:layout_height="200dp"/>

ViewPager2 里面是通过 Recyclerview 去编写的,所以也是使用 setAdapter 的模式。

1.1 使用RecyclerView.Adapter

当我们使用一个简单的view 来充当 viewpager 的容器时,可以通过集成 RecycelrView.adater 来实现,既然是 RecyclerView,那么久需要 ViewHolder 了,所以写法跟RecyclerView差不多。首先写一个 ViewHodler

 class ViewPagerHolder extends RecyclerView.ViewHolder {
            TextView textView;

            public ViewPagerHolder(@NonNull View itemView) {
                super(itemView);
                textView = itemView.findViewById(R.id.item_text);
            }
        }

然后在写一个 类 继承RecyclerView.Adapter,完整代码如下:

/**
     * 简单view
     */
    class ViewAdapter extends RecyclerView.Adapter<ViewAdapter.ViewPagerHolder>{

        List<Integer> datas;

        public ViewAdapter(List<Integer> datas) {
            this.datas = datas;
        }

        @NonNull
        @Override
        public ViewPagerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_text,parent,false);
            return new ViewPagerHolder(view);
        }

        @Override
        public void onBindViewHolder(@NonNull ViewPagerHolder holder, int position) {
            holder.textView.setText("页面"+position);
            holder.textView.setBackgroundColor(datas.get(position));
        }

        @Override
        public int getItemCount() {
            return datas.size();
        }

        class ViewPagerHolder extends RecyclerView.ViewHolder {
            TextView textView;

            public ViewPagerHolder(@NonNull View itemView) {
                super(itemView);
                textView = itemView.findViewById(R.id.item_text);
            }
        }
    }

调用也非常简单,如下:

 ViewPager2 page = findViewById(R.id.page);

        List<Integer> colors = new ArrayList<>();
        colors.add(Color.BLUE);
        colors.add(Color.DKGRAY);
        colors.add(Color.LTGRAY);


        page.setAdapter(new ViewAdapter(colors));

效果如下:
在这里插入图片描述

1.2 竖直方向

要使用竖直方向也非常简单,只需要加一句话:

 //置换成竖直
page.setOrientation(ViewPager2.ORIENTATION_VERTICAL);

看看效果:
在这里插入图片描述
就是这么简单,如果不使用 ViewPager2,这个竖直的,估计就得借用第三方工具或者自己自定义 ViewGroup 了。

1.3 与Fragment 结合

在使用 ViewPager 的时候,可以使用 FragmentPagerAdapter 实现页数小的情况,用 FragmentStatePagerAdapter 实现页面比较多的情况。ViewPager2 则没有那么多,直接使用 FragmentStateAdapter 即可。

首先构建一个 fragment,就一个 TextView:

public class TextTitleFragment extends Fragment {

    public static TextTitleFragment newInstance(String title) {

        Bundle args = new Bundle();
        args.putString("title",title);
        TextTitleFragment fragment = new TextTitleFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        TextView textView = new TextView(getContext());
        String title = getArguments().getString("title");
        textView.setText(title);
        textView.setTextSize(32);
        textView.setGravity(Gravity.CENTER);
        textView.setBackgroundColor(Color.parseColor("#30ff0000"));
        return textView;
    }
}

首先编写 FragmentStateAdapter ,如下:

class FragmentAdapter extends FragmentStateAdapter {
        List<Fragment> fragments;
        public FragmentAdapter(@NonNull FragmentManager fm,List<Fragment> fragments) {
            super(fm);
            this.fragments = fragments;
        }

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



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

跟上面差不多,直接 setAdapter 即可:

  List<Fragment> fragments = new ArrayList<>();
        fragments.add(TextTitleFragment.newInstance("页面1"));
        fragments.add(TextTitleFragment.newInstance("页面2"));
        fragments.add(TextTitleFragment.newInstance("页面3"));

        page2.setAdapter(new FragmentAdapter(getSupportFragmentManager(),fragments));

效果如下:
在这里插入图片描述
这样就可以了。

二 、监听页面和刷新

如果想要监听 页面滑动,可以使用 registerOnPageChangeCallback 方法:

page2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                super.onPageScrolled(position, positionOffset, positionOffsetPixels);
            }

            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                super.onPageScrollStateChanged(state);
            }
        });

当然,如果你想刷新数据,由于 V诶wPager2 是基于 RecyclerView 的,所以你也可以使用 DiffUtil 去刷新,当然也可以一刀切,使用 adapter.notifyDataSetChanged();

这样,ViewPager2 就算入门了,你可以使用它来实现 banner,自定义自己的 tablayout 等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章