首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SwipeRefreshLayout + ViewPager,是否仅限制水平滚动?

SwipeRefreshLayout + ViewPager,是否仅限制水平滚动?
EN

Stack Overflow用户
提问于 2014-09-23 00:06:52
回答 7查看 33K关注 0票数 98

我已经在我的应用程序中实现了SwipeRefreshLayoutViewPager,但有一个很大的问题:每当我要向左/向右滑动在页面之间切换时,滚动都太敏感。向下滑动一点也会触发SwipeRefreshLayout刷新。

我想设置一个水平滑动开始的时间限制,然后强制水平滑动,直到滑动结束。换句话说,当手指水平移动时,我想取消垂直滑动。

这个问题只在ViewPager上发生,如果我向下滑动,SwipeRefreshLayout刷新功能被触发(显示条),然后我水平移动我的手指,它仍然只允许垂直滑动。

我试图扩展ViewPager类,但它根本不起作用:

代码语言:javascript
复制
public class CustomViewPager extends ViewPager {

    public CustomViewPager(Context ctx, AttributeSet attrs) {
        super(ctx, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean in = super.onInterceptTouchEvent(ev);
        if (in) {
            getParent().requestDisallowInterceptTouchEvent(true);
            this.requestDisallowInterceptTouchEvent(true);
        }
        return false;
    }

}

布局xml:

代码语言:javascript
复制
<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/viewTopic"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.myapp.listloader.foundation.CustomViewPager
        android:id="@+id/topicViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>

感谢您的帮助,谢谢!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-09-23 18:03:15

非常简单地解决了,不需要扩展任何东西

代码语言:javascript
复制
mPager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mLayout.setEnabled(false);
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                mLayout.setEnabled(true);
                break;
        }
        return false;
    }
});

像个护身符一样工作

票数 37
EN

Stack Overflow用户

发布于 2015-04-29 22:30:52

我不确定你是否仍然有这个问题,但是Google I/O应用程序丢失解决了这个问题:

代码语言:javascript
复制
    viewPager.addOnPageChangeListener( new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled( int position, float v, int i1 ) {
        }

        @Override
        public void onPageSelected( int position ) {
        }

        @Override
        public void onPageScrollStateChanged( int state ) {
            enableDisableSwipeRefresh( state == ViewPager.SCROLL_STATE_IDLE );
        }
    } );


private void enableDisableSwipeRefresh(boolean enable) {
    if (swipeContainer != null) {
            swipeContainer.setEnabled(enable);
    }
}

我已经使用了相同的方法,并且工作得很好。

编辑:使用addOnPageChangeListener()而不是setOnPageChangeListener()。

票数 164
EN

Stack Overflow用户

发布于 2015-10-19 13:43:32

我遇到了你的问题。自定义SwipeRefreshLayout可以解决这个问题。

代码语言:javascript
复制
public class CustomSwipeToRefresh extends SwipeRefreshLayout {

private int mTouchSlop;
private float mPrevX;

public CustomSwipeToRefresh(Context context, AttributeSet attrs) {
    super(context, attrs);

    mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mPrevX = MotionEvent.obtain(event).getX();
            break;

        case MotionEvent.ACTION_MOVE:
            final float eventX = event.getX();
            float xDiff = Math.abs(eventX - mPrevX);

            if (xDiff > mTouchSlop) {
                return false;
            }
    }

    return super.onInterceptTouchEvent(event);
}

请参阅参考文献:link

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25978462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档