我已经在我的应用程序中实现了SwipeRefreshLayout
和ViewPager
,但有一个很大的问题:每当我要向左/向右滑动在页面之间切换时,滚动都太敏感。向下滑动一点也会触发SwipeRefreshLayout
刷新。
我想设置一个水平滑动开始的时间限制,然后强制水平滑动,直到滑动结束。换句话说,当手指水平移动时,我想取消垂直滑动。
这个问题只在ViewPager
上发生,如果我向下滑动,SwipeRefreshLayout
刷新功能被触发(显示条),然后我水平移动我的手指,它仍然只允许垂直滑动。
我试图扩展ViewPager
类,但它根本不起作用:
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:
<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>
感谢您的帮助,谢谢!
发布于 2014-09-23 18:03:15
非常简单地解决了,不需要扩展任何东西
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;
}
});
像个护身符一样工作
发布于 2015-04-29 22:30:52
我不确定你是否仍然有这个问题,但是Google I/O应用程序丢失解决了这个问题:
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()。
发布于 2015-10-19 13:43:32
我遇到了你的问题。自定义SwipeRefreshLayout可以解决这个问题。
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
https://stackoverflow.com/questions/25978462
复制相似问题