在 Android 的 ViewPager2 中检测滑动出界

fla*_*rud 3 android androidx android-viewpager2

我正在使用ViewPager2并希望检测用户何时在第一页上向左滑动或在最后一页上向右滑动。

我知道这可以使用此处ViewPager讨论的旧方法来实现,但这种方法不可行,因为它是最终的并且不能子类化。ViewPager2

ViewPager2提供了OnPageChangeCallback但这也不能使用,因为滑动越界时没有页面事件。

我错过了什么吗?

fla*_*rud 5

当我输入这个问题时,我想出了一个(有点老套的)解决方案。

它基于这样的观察:SCROLL_STATE_SETTLING只有当 viewpager 真正停在新页面上时才会达到该状态。如果仅在第一页或最后一页上进行无结果的拖动,则仅传递statesSCROLL_STATE_DRAGGING和 finally 。SCROLL_STATE_IDLE

viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {

        private boolean settled = false;

        @Override
        public void onPageScrollStateChanged(int state) {
            super.onPageScrollStateChanged(state);
            if (state == SCROLL_STATE_DRAGGING) {
                settled = false;
            }
            if (state == SCROLL_STATE_SETTLING) {
                settled = true;
            }
            if (state == SCROLL_STATE_IDLE && !settled) {
                doYourOutOfBoundsStuff();
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

我并不完全高兴,但这是迄今为止我遇到的最好的。