[英]Android Listview inside ViewPager, No horizontal swipe
我有一个举行viewpager的活动。 viewpager中的一个片段包括一个listview,它几乎覆盖了整个屏幕,但是只需要被动地显示项目(无需单击所需的项目)。
我试过在SO上找到几个选项来禁用对listview的单击和/或不消耗listview / adapter的单击等的适配器或构建侦听器,但是没有一个解决了我的问题:
当listview充满项目时,我必须在显示器的最外边缘滑动才能移动到viewpager的另一个片段。 例如,在其他片段上,我没有列表视图,但是其他视图(如地图),并且可以直接在显示中间进行滑动手势时在片段之间进行滑动。
为了获得一致的用户体验,我还希望在包含被动listview的片段上执行此操作。
谢谢。
通过扩展自定义ViewPager并实现dispatchTouchEvent。
我们开始在ACTION_DOWN
跟踪触摸(屏幕上的像素位置)。 当我们看到这是一个横向轻扫,我们不叫super.dispatchTouchEvent( event )
-这将做默认路由onTouch,使某些孩子的意见消耗水平刷卡太-但调用onTouchEvent( event )
而不是ACTION_MOVE
和也ACTION_UP
。
public class MyViewPager extends ViewPager {
private float mLastX;
private float mLastY;
private final int mTouchSlop = ViewConfiguration.get( getContext() ).getScaledTouchSlop();
private float mStartX;
public MyViewPager( Context context ) {
super( context );
}
public MyViewPager( Context context, AttributeSet attrs ) {
super( context, attrs );
}
@Override
public boolean dispatchTouchEvent( MotionEvent event ) {
switch( event.getAction() ) {
case MotionEvent.ACTION_DOWN:
mLastX = event.getX();
mLastY = event.getY();
mStartX = event.getX();
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
onTouchEvent( event );
break;
case MotionEvent.ACTION_MOVE:
float x = event.getX();
float y = event.getY();
float xDelta = x - mLastX;
float xDeltaAbs = Math.abs( xDelta );
float yDeltaAbs = Math.abs( y - mLastY );
float xDeltaTotal = x - mStartX;
if( Math.abs( xDeltaTotal ) > mTouchSlop )
if( xDeltaAbs > yDeltaAbs )
return onTouchEvent( event );
}
return super.dispatchTouchEvent( event );
}
}
public boolean onTouch(View v, MotionEvent e) {
if(e.getAction() == MotionEvent.ACTION_DOWN){
listItem.getParent().requestDisallowInterceptTouchEvent(true);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.