ViewPager里面的Android Listview,没有横向滑动

时间:2016-02-09 14:52:49

标签: android listview android-viewpager

我有一个持有viewpager的活动。 viewpager中的一个片段包含一个几乎涵盖整个屏幕的列表视图,但只能被动地显示项目(不需要点击所需的项目)。

我已尝试在SO上找到几个选项来禁用listview上的点击和/或它的适配器或构建侦听器,它们不使用listview / adapter的点击等,但没有解决我的问题:

当列表视图中的项目已满时,我必须在显示屏的外边缘滑动以移动到viewpager的另一个片段。在其他片段上,例如我没有列表视图,但是其他视图(如地图)可以直接在显示屏中间进行滑动手势时在片段之间滑动。

为了获得一致的用户体验,我还希望在包含被动列表视图的片段上使用此行为。

谢谢。

2 个答案:

答案 0 :(得分:1)

通过扩展自定义ViewPager并实现dispatchTouchEvent。

我们开始跟踪ACTION_DOWN中的触摸(在场景上的像素位置)。当我们看到它是水平滑动时,我们不会调用super.dispatchTouchEvent( event ) - 这将执行默认的onTouch路由并使某些子视图也消耗水平滑动 - 但是在{onTouchEvent( event )中调用ACTION_MOVE {1}}以及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 );
  }
}

答案 1 :(得分:0)

public boolean onTouch(View v, MotionEvent e) {
    if(e.getAction() == MotionEvent.ACTION_DOWN){
       listItem.getParent().requestDisallowInterceptTouchEvent(true);
    }
}