Android Listview内置ViewPager,无需水平滑动
我有一个活动拿着一个viewpager。viewpager中的一个片段包括一个listview,它几乎覆盖了整个屏幕,但只能被动地显示项目(不需要单击项目) 我尝试了在SO上找到的几个选项,以禁用对listview和/或不使用listview/适配器的单击的适配器或构建侦听器的单击,等等。但没有解决我的问题: 当listview中充满了项目时,我必须在显示屏的最外层边缘滑动,以移动到viewpager的另一个片段。例如,在其他片段上,我没有ListView,但其他视图(如地图)可以在片段之间滑动,当直接在显示器中间进行滑动手势时 为了获得一致的用户体验,我还希望在持有被动listview的片段上有这种行为Android Listview内置ViewPager,无需水平滑动,android,listview,android-viewpager,Android,Listview,Android Viewpager,我有一个活动拿着一个viewpager。viewpager中的一个片段包括一个listview,它几乎覆盖了整个屏幕,但只能被动地显示项目(不需要单击项目) 我尝试了在SO上找到的几个选项,以禁用对listview和/或不使用listview/适配器的单击的适配器或构建侦听器的单击,等等。但没有解决我的问题: 当listview中充满了项目时,我必须在显示屏的最外层边缘滑动,以移动到viewpager的另一个片段。例如,在其他片段上,我没有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不再是滚动列表的最佳选择。