我有一个持有viewpager的活动。 viewpager中的一个片段包含一个几乎涵盖整个屏幕的列表视图,但只能被动地显示项目(不需要点击所需的项目)。
我已尝试在SO上找到几个选项来禁用listview上的点击和/或它的适配器或构建侦听器,它们不使用listview / adapter的点击等,但没有解决我的问题:
当列表视图中的项目已满时,我必须在显示屏的外边缘滑动以移动到viewpager的另一个片段。在其他片段上,例如我没有列表视图,但是其他视图(如地图)可以直接在显示屏中间进行滑动手势时在片段之间滑动。
为了获得一致的用户体验,我还希望在包含被动列表视图的片段上使用此行为。
谢谢。
答案 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);
}
}