繁体   English   中英

ViewPager内的Android Listview,无水平滑动

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM