SlidingMenu+ViewPage+ListView嵌套(类似网易 ) ListView点击事件失效冲突问题解决

SlidingView  方法onInterceptTouchEvent修改

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
//		System.out.println("SlidingView onInterceptTouchEvent");
		try{
			final int action = ev.getAction();
			final float x = ev.getX();
			final float y = ev.getY();
	
			switch (action) {
			case MotionEvent.ACTION_DOWN:
				mIsAlreadySetViewState = false;
				mLastMotionX = x;
				mLastMotionY = y;
				mIsBeingDragged = false;
				break;
	
			case MotionEvent.ACTION_MOVE:
				final float dx = x - mLastMotionX;
				final float xDiff = Math.abs(dx);
				final float yDiff = Math.abs(y - mLastMotionY);
				if(askChild(this,ev,  dx,dx)){
				      return false;
				}
				if (xDiff > mTouchSlop && xDiff > yDiff) {
					mIsBeingDragged = true;
					mLastMotionX = x;
				}
				break;
	
			}
			return mIsBeingDragged;
		}catch(IllegalArgumentException ex) {  
			ex.printStackTrace();
			return false;
		}
	}
	private boolean askChild(Object v,MotionEvent ev,float dx,float xDiff ){
	       ViewGroup vg = null;
	      if(v instanceof ViewGroup){
	           vg = (ViewGroup)v;
	       }else{
	           return false;
	       }
	      
	   for(int i=0;i<vg.getChildCount();i++){
		  if (vg.getChildAt(i) instanceof HorizontalScrollView) {//(这是以HorizontalScrollView为例,其它可以自行加判断)
	          return ((ViewGroup)vg.getChildAt(i)).onInterceptTouchEvent(ev);
	      }else if (vg.getChildAt(i) instanceof MyViewPage) {
//	    	  System.out.println(" instanceof MyViewPage"+((ViewGroup)vg.getChildAt(i)).onInterceptTouchEvent(ev));
	    	  System.out.println(xDiff +"-----------"+scrollX);
	    	  MyViewPage mvp=( MyViewPage) vg.getChildAt(i);  
	    	  
	    	  if(mvp.getPosition()==0)
		    	  if(xDiff>0)//右滑  
		                return false;//((ViewGroup)vg.getChildAt(i)).onInterceptTouchEvent(ev);
		    	  else
		    		  if(scrollX<0)//左侧出来
		    		  return false;
		    		  else
		    			  return true;
	    	  else
	    		  return true;
         }
           if(askChild(vg.getChildAt(i), ev,dx,xDiff )){
                return true;
           }
	     }
	    return false;
	}
	float scrollX =0;
之前ViewPage的onInterceptTouchEvent重写 去掉了,不用重写了

代码

http://download.csdn.net/detail/lj102800/7041393


在使用 ViewPager 时,可能会遇到与点击事件冲突问题。例如,当 ViewPager 中的子 View 需要响应点击事件时,可能会与 ViewPager 的滑动手势冲突,导致无法正常响应点击事件。 为了解决这个问题,可以通过以下方法来实现: 1. 自定义一个可以拦截点击事件ViewPager,例如: ```java public class InterceptViewPager extends ViewPager { public InterceptViewPager(Context context) { super(context); } public InterceptViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // 如果当前正在滑动,则不拦截点击事件 if (getCurrentItem() != 0 && getCurrentItem() != getChildCount() - 1) { return super.onInterceptTouchEvent(ev); } else { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: // 记录按下的位置 mXDown = ev.getRawX(); mYDown = ev.getRawY(); break; case MotionEvent.ACTION_MOVE: // 判断是否需要拦截点击事件 float xMove = ev.getRawX(); float yMove = ev.getRawY(); int diffX = (int) (xMove - mXDown); int diffY = (int) (yMove - mYDown); if (Math.abs(diffX) > Math.abs(diffY)) { return true; } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: break; default: break; } return super.onInterceptTouchEvent(ev); } } } ``` 该自定义 ViewPager 在滑动时不会拦截点击事件,只有在判断为需要拦截点击事件时才会拦截。 2. 将需要响应点击事件的子 View 中的点击事件拦截掉,例如: ```java childView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 拦截点击事件 return true; } }); ``` 这样就可以解决 ViewPager 中的点击事件冲突问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值