在Android的ViewPager2中检测滑动越界

3
我正在使用ViewPager2,想要检测用户是否在第一页向左滑动或在最后一页向右滑动。
我知道可以使用旧的ViewPager实现这一点,就像这里讨论的那样,但这种方法不可行,因为ViewPager2是final类型的,无法被子类化。 ViewPager2提供了OnPageChangeCallback,但由于没有页面事件可以在滑动越界时使用,因此也不能使用它。
我有什么遗漏的吗?
2个回答

5
我在打这个问题的时候想到了一个(有点hacky)的解决方法。它基于这样一个观察结果:只有当viewpager真正落在新页面上时,才会达到状态 SCROLL_STATE_SETTLING 。如果在第一页或最后一页上只是毫无意义地拖动,则仅传递状态 SCROLL_STATE_DRAGGING 和最终的 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();
            }
        }
    });

我并不完全满意,但这是目前我找到的最好的。


0

谢谢,@flauschtrud 为了更好地处理在您的子选项卡布局上向右交换到最后一个索引或向左交换到第一个索引,我在挑战中使用了此代码。当我想要在嵌套的选项卡布局上更改分页时,因为SwipeChangeListener无法检测到当您位于选项卡布局项的第一个索引或最后一个索引时向左和向右的交换。

yourChildViewPager.registerOnPageChangeCallback(object :
            OnPageChangeCallback() {
            private var settled = false
            override fun onPageScrollStateChanged(state: Int) {
                super.onPageScrollStateChanged(state)
                if (state == SCROLL_STATE_DRAGGING) {
                    settled = false
                }
                if (state == SCROLL_STATE_SETTLING) {
                    settled = true
                }
                if (state == SCROLL_STATE_IDLE && !settled) {
                    if (yourChildViewPager.currentItem == 0) {
                        backDirectionToParentViewPager()
                    } else {
                        forwardDirectionToParentViewPager()
                    }
                }
            }
        })

注意:您可以使用以下代码在父视图页(ViewPager2)中处理禁用或启用分页:
   yourParentViewPager.isUserInputEnabled = (true or false)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接