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