【问题标题】:ViewPager2: How to prevent the creation of fragments from interferring with the swipe animation?ViewPager2:如何防止创建片段干扰滑动动画?
【发布时间】:2020-03-03 11:17:31
【问题描述】:

我有一个带有 FragmentStateAdapterViewPager2 和 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


【解决方案1】:

我的解决方案:

        view_pager.registerOnPageChangeCallback(object :
        ViewPager2.OnPageChangeCallback() {
        override fun onPageScrollStateChanged(state: Int) {
            super.onPageScrollStateChanged(state)
            when (state) {
                SCROLL_STATE_IDLE -> {
                    view_pager.offscreenPageLimit = 1
                }
                SCROLL_STATE_DRAGGING -> {
                    view_pager.offscreenPageLimit = OFFSCREEN_PAGE_LIMIT_DEFAULT
                }
            }
        }
    })
    view_pager.offscreenPageLimit = 1

SCROLL_STATE_DRAGGING 时设置offscreenPageLimit = OFFSCREEN_PAGE_LIMIT_DEFAULT 防止在滑动手势上创建下一个片段。并在滑动手势设置offscreenPageLimit = 1 后创建下一个片段

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多