初识ViewPager2

ViewPager2是Google于2019年2月7号发布的ViewPager的升级版本,目前最新版本是1.0.0-alpha01。ViewPager2主要解决了传统ViewPager中的几个问题:

  • 不支持从右到左布局
  • 不支持纵向滚动
  • notifyDataSetChanged()有时不起作用的Bug

实现原理

查看ViewPager2内部代码可以看出,其实现原理是在其内部封装了一个RecyclerView,利用LinearLayoutManager+PagerSnapHelper实现了ViewPager的滚动效果以及对纵向滚动的支持。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ViewPager2 extends ViewGroup {

private void initialize(Context context, AttributeSet attrs) {
mRecyclerView = new RecyclerView(context) {
...
};

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

new PagerSnapHelper().attachToRecyclerView(mRecyclerView);
...
}
}

目前存在的问题:

由于直接使用的RecycleView实现,一些ViewPager的特性没有得到完全实现,官方指出了下面几个问题:

  • 不支持设置offscreen limit
  • 与TabLayout的集成存在问题
  • FragmentStateAdapter还有稳定性问题
  • 不支持设置pageWitch,默认100%/100%
  • 不支持clipToPadding
  • 不支持fakeDrag
  • 设置page transformer时,不支持设置绘制顺序

使用方法:

其使用方法与传统ViewPager类似:

1.在模块gradle中添加依赖:

1
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha01'

2.在Layout文件中布局,这里可以设置滚动方向:

1
2
3
4
5
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" />

3.创建Adapter,ViewPager2使用FragmentStateAdapter来实现Fragment的管理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ViewPager2Adapter extends FragmentStateAdapter {

public ViewPager2Adapter(@NonNull FragmentManager fragmentManager) {
super(fragmentManager);
}

@NonNull
@Override
public Fragment getItem(int position) {
return new SimpleFragment();
}

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

4.应用Adapter:

1
2
3
viewPager2 = findViewById(R.id.viewpager2);
ViewPager2Adapter adapter = new ViewPager2Adapter(getSupportFragmentManager());
viewPager2.setAdapter(adapter);

总结

ViewPager2具有原生支持垂直方向滑动的特性,但是由于目前FragmentStateAdapter还有稳定性问题,以及设置page transformer时,不支持设置绘制顺序,在实际应用时还需要多进行修改和测试。建议等官方推出稳定版本后,再考虑接入。

参考:

[1] https://developer.android.com/jetpack/androidx/releases/viewpager2

[2] https://developer.android.google.cn/reference/androidx/viewpager2/adapter/FragmentStateAdapter

[3] https://developer.android.google.cn/reference/androidx/viewpager2/widget/ViewPager2

[4] https://www.journaldev.com/26148/android-viewpager2

Author

calvinche

Posted on

2019-03-11

Licensed under

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×