Android Listview内置ViewPager,无需水平滑动

Android Listview内置ViewPager,无需水平滑动,android,listview,android-viewpager,Android,Listview,Android Viewpager,我有一个活动拿着一个viewpager。viewpager中的一个片段包括一个listview,它几乎覆盖了整个屏幕,但只能被动地显示项目(不需要单击项目) 我尝试了在SO上找到的几个选项,以禁用对listview和/或不使用listview/适配器的单击的适配器或构建侦听器的单击,等等。但没有解决我的问题: 当listview中充满了项目时,我必须在显示屏的最外层边缘滑动,以移动到viewpager的另一个片段。例如,在其他片段上,我没有ListView,但其他视图(如地图)可以在片段之间滑动

我有一个活动拿着一个viewpager。viewpager中的一个片段包括一个listview,它几乎覆盖了整个屏幕,但只能被动地显示项目(不需要单击项目)

我尝试了在SO上找到的几个选项,以禁用对listview和/或不使用listview/适配器的单击的适配器或构建侦听器的单击,等等。但没有解决我的问题:

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

为了获得一致的用户体验,我还希望在持有被动listview的片段上有这种行为


谢谢。

通过扩展创建自定义的ViewPager并实现dispatchTouchEvent

public boolean onTouch(View v, MotionEvent e) {
    if(e.getAction() == MotionEvent.ACTION_DOWN){
       listItem.getParent().requestDisallowInterceptTouchEvent(true);
    }
}
我们开始在
ACTION\u DOWN
中跟踪触摸(屏幕上的像素位置)。当我们看到它是水平滑动时,我们不会调用
super.dispatchTouchEvent(event)
——这将执行默认的onTouch路由并使某些子视图也使用水平滑动——而是在
ACTION\u MOVE
ACTION\u UP
中调用
onTouchEvent(event)

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 );
  }
}

考虑使用RealdVIEW。ListView不再是滚动列表的最佳选择。