【发布时间】:2020-03-03 11:17:31
【问题描述】:
我有一个带有 FragmentStateAdapter 的 ViewPager2 和 1 的屏幕外页面限制:
viewPager.setAdapter(new MyFragmentStateAdapter(this));
viewPager.setOffscreenPageLimit(1);
public class MyFragmentStateAdapter extends FragmentStateAdapter {
MyFragmentStateAdapter(@NonNull Fragment fragment) {
super(fragment);
}
@NonNull
@Override
public Fragment createFragment(int position) {
return new ItemFragment(position);
}
@Override
public int getItemCount() {
return 15;
}
}
发生了什么:
- 我观察到,每次在视图寻呼机上滑动时,滑动动画中都会出现卡顿。于是我开始调查。
我的发现:
- 我发现 ViewPager2 中的新屏幕外片段是在在滑动手势的开头创建的(而现在已弃用的 ViewPager 在在滑动手势的末尾创建它们)。
- setOffscreenPageLimit 的值是多少并不重要(除非您打算一次加载所有片段)。每次视图寻呼机需要创建新的屏幕外片段时都会出现此问题。
为什么这是个问题:
- 这意味着片段的创建将始终干扰滑动动画,基本上违背了 setOffscreenPageLimit 的目的(但是,如果您的片段非常轻量级,您可能不会注意到问题)。李>
问题:
- 有没有办法强制 ViewPager2 和 FragmentStateAdapter 在滑动动画的结尾创建屏幕外片段(就像已弃用的 ViewPager 所做的那样)?
【问题讨论】:
-
你好@jmart,你有没有找到解决这个问题的方法。谢谢。
-
@Jack 还没有,但我在问题跟踪器 (issuetracker.google.com/issues/150626937) 上打开了一个问题并被接受,所以我想我们必须等到新版本的 ViewPager2 发布。
-
感谢您告诉我。
-
是的,我也面临这个问题。每次我刷卡时它都会卡顿,我一刷卡就会加载数据,所以很明显它“卡顿”
-
@jmart,您找到解决此问题的方法了吗?我目前正在通过在调用 notifyDataSetChanged() 时设置一个延迟 300 毫秒的 postDelayed-Handler 来规避它,但这在我看来就像一个 hack。下面的 onPageScrollStateChanged 解决方案对我的情况没有任何影响。我可以在 Perfetto 跟踪中清楚地看到滑动动画开始(片段 #1 -> #2),然后很快被 UI 线程上正在刷新的片段(#3)数据(notifyDataSetChanged)打断。
标签: android android-viewpager2