Android ListView中嵌套ScrollView,ScrollView不能滚动

在ListView中嵌套ScrollView时,ScrollView不能滚动,只需要在Adapter中加入下面代码:


holder.itemScroll.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				Logger.w("MySpaceTimeListAdapter", "onTouch event:" + event.getAction());
				
				/*addVelocityTracker(event);
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN: {
					downX = (int) event.getX();
					downY = (int) event.getY();
					break;
				}
				case MotionEvent.ACTION_MOVE: {
					if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY
							|| (Math.abs(event.getX() - downX) > 2 * mTouchSlop && Math
									.abs(event.getY() - downY) < 2 * mTouchSlop)) {
						view.getParent().requestDisallowInterceptTouchEvent(false);
					} else {
						view.getParent().requestDisallowInterceptTouchEvent(true);// true表示父类的不可用;
					}
					break;
				}
				case MotionEvent.ACTION_UP:
					view.getParent().requestDisallowInterceptTouchEvent(false);
					recycleVelocityTracker();
					break;
				}
				*/
				if (event.getAction() == MotionEvent.ACTION_UP) {
					view.getParent().requestDisallowInterceptTouchEvent(false);
				} else {
					view.getParent().requestDisallowInterceptTouchEvent(true);// true表示父类的不可用;
				}
				return false;
			}
		});

关键代码是:

view.getParent().requestDisallowInterceptTouchEvent(true);// true表示父类的不可用;

屏蔽父控件的Touch Event。


你也可以进一步对Move事件进行判断,特定条件下才屏蔽父控件父控件

<span style="white-space:pre">				</span>addVelocityTracker(event);
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN: {
					downX = (int) event.getX();
					downY = (int) event.getY();
					break;
				}
				case MotionEvent.ACTION_MOVE: {
					if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY
							|| (Math.abs(event.getX() - downX) > 2 * mTouchSlop && Math
									.abs(event.getY() - downY) < 2 * mTouchSlop)) {
						view.getParent().requestDisallowInterceptTouchEvent(false);
					} else {
						view.getParent().requestDisallowInterceptTouchEvent(true);// true表示父类的不可用;
					}
					break;
				}
				case MotionEvent.ACTION_UP:
					view.getParent().requestDisallowInterceptTouchEvent(false);
					recycleVelocityTracker();
					break;
				}
				


/**
	 * 速度追踪对象
	 */
	private VelocityTracker velocityTracker;

	private static final int SNAP_VELOCITY = 600;

	/**
	 * 认为是用户滑动的最小距离
	 */
	private int mTouchSlop;
	/**
	 * 手指按下X的坐标
	 */
	private int downX;
	/**
	 * 手指按下Y的坐标
	 */
	private int downY;
	
	/**
	 * 添加用户的速度跟踪器
	 * 
	 * @param event
	 */
	private void addVelocityTracker(MotionEvent event) {
		if (velocityTracker == null) {
			velocityTracker = VelocityTracker.obtain();
		}

		velocityTracker.addMovement(event);
	}

	/**
	 * 移除用户速度跟踪器
	 */
	private void recycleVelocityTracker() {
		if (velocityTracker != null) {
			velocityTracker.recycle();
			velocityTracker = null;
		}
	}

	/**
	 * 获取X方向的滑动速度,大于0向右滑动,反之向左
	 * 
	 * @return
	 */
	private int getScrollVelocity() {
		velocityTracker.computeCurrentVelocity(1000);
		int velocity = (int) velocityTracker.getXVelocity();
		return velocity;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值