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

来源:互联网 发布:mysql union 效率 编辑:程序博客网 时间:2024/05/16 08:38

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


holder.itemScroll.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubLogger.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
原创粉丝点击