ViewPager2 从出来到现在已经有一段时间了,它修复了 ViewPager 常见的一些 bug,以及支持竖直方法和 RTL , 现在很多小伙伴已经开始使用上了。那么,学不懂也要学。
首先,你的工程必须支持 androidx,我觉得新开的工程都可以使用 androidx了,一些主流的第三方库也都支持,而且 google 也说28以后,不再支持 support 库,当然这个看个人。
关联 viewpager2:
implementation "androidx.viewpager2:viewpager2:1.0.0"
它 的使用与 ViewPager 没多大区别。首先在 xml 中写上布局:
ViewPager2 里面是通过 Recyclerview 去编写的,所以也是使用 setAdapter 的模式。
当我们使用一个简单的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{
List datas;
public ViewAdapter(List 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 colors = new ArrayList<>();
colors.add(Color.BLUE);
colors.add(Color.DKGRAY);
colors.add(Color.LTGRAY);
page.setAdapter(new ViewAdapter(colors));
要使用竖直方向也非常简单,只需要加一句话:
//置换成竖直
page.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
看看效果:
就是这么简单,如果不使用 ViewPager2,这个竖直的,估计就得借用第三方工具或者自己自定义 ViewGroup 了。
在使用 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 fragments;
public FragmentAdapter(@NonNull FragmentManager fm,List 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 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 等。