ViewPager2:如何防止片段的创建干扰滑动动画?

时间:2020-03-03 11:17:31

标签: android android-viewpager2

我有一个 ViewPager2 和一个 FragmentStateAdapter ,并且屏幕外限制为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;
    }

}

发生了什么事

  • 我观察到,每次我在视图寻呼机上滑动时,滑动动画中都会出现 stutter 。所以我开始调查。

我发现了什么

  • 我发现在ViewPager2中,新画面外片段是在滑动手势的开头创建的(而现在不赞成使用的ViewPager在滑动手势的结尾创建了 )。
  • setOffscreenPageLimit的值无关紧要(除非您打算一次加载所有片段)。每当视图分页器需要创建新的屏幕外片段时,都会发生此问题。

为什么这是个问题:

  • 这意味着片段的创建将始终干扰,从而基本上抵消了setOffscreenPageLimit的目的(但是,如果片段非常轻巧,您可能不会注意到问题)。
  • li>

问题:

  • 是否有一种方法可以用FragmentStateAdapter强制ViewPager2在滑动动画的结尾 创建离屏片段(就像不赞成使用的ViewPager一样)?

1 个答案:

答案 0 :(得分: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

设置 offscreenPageLimit = OFFSCREEN_PAGE_LIMIT_DEFAULTSCROLL_STATE_DRAGGING 防止在滑动手势上创建下一个片段。并在滑动手势设置 offscreenPageLimit = 1 后导致创建下一个片段