Gridview的onItemClick事件无响应 - 逝去的青春

Gridview的onItemClick事件无响应

作者:jao 发布于:2014-8-21 16:52 分类:Andriod开发

思路来自于文文章:Gridview的手势滑动与onItemClick事件有冲突

原作者说:用ViewFlipper实现了多页Gridview的滑屏效果。问题是,当OnFling事件发生时,往往也会伴随着发生Gridview的 onItemClick事件。(我既希望处理OnFling实现多页滑屏,也希望能够处理每页中Gridview的元素单击事件,但是不希望两者同时发 生,否则就有冲突了。)具体代码如下......


这里就不再多说别人的问题了,解决这个问题我可是花了2个多小时啊。写下这篇文章给大家带来帮助也方便自己以后查询


我在原来的TouchListener中写的代码出了问题,具体代码如下


public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		if (event.getAction() == MotionEvent.ACTION_DOWN) { 
            // 取得左右滑动时手指按下的X坐标 
            touchDownX = event.getX();
            return true; 
        } else if (event.getAction() == MotionEvent.ACTION_UP) { 
            // 取得左右滑动时手指松开的X坐标 
            touchUpX = event.getX(); 
           
            if (touchUpX - touchDownX > 80) { 
                // 从右往左,看前一个View 
            	Log.v("ChatFaceGridViewFlipper", " 从右往左,看前一个View");
            	// 设置View切换的动画 
        		viewFlipper.setInAnimation(AnimationUtils.loadAnimation(c, 
                        android.R.anim.slide_in_left)); 
                viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(c, 
                        android.R.anim.slide_out_right)); 
                viewFlipper.showPrevious();
                Log.v("ChatFaceGridViewFlipperOnTouchListener__position", String.valueOf(position));
                ((ChatFacePageImageView)mrlFacePageImageView).setPageImageView(numCount, position, resId,false);
            } else if (touchDownX - touchUpX > 80) { 
            	// 从左往右,看后一个View 
            	Log.v("ChatFaceGridViewFlipper", " 从左往右,看后一个View");
            	viewFlipper.setInAnimation(AnimationUtils.loadAnimation(c, 
                        R.anim.slide_in_right)); 
                viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(c, 
                        R.anim.slide_out_left));
                viewFlipper.showNext();
                Log.v("ChatFaceGridViewFlipperOnTouchListener__position", String.valueOf(position));
                ((ChatFacePageImageView)mrlFacePageImageView).setPageImageView(numCount, position, resId,true);
            } 
           // ChatFacePageImageView cfpRl=new ChatFacePageImageView(c);
           // if(position<numCount){
           // cfpRl.setPageImageView(numCount, position, resId);
            //}
           
            return true; 
        }
		return false; 
	}


修改代码后为


public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		if (event.getAction() == MotionEvent.ACTION_DOWN) { 
            // 取得左右滑动时手指按下的X坐标 
            touchDownX = event.getX();
            return true; 
        } else if (event.getAction() == MotionEvent.ACTION_UP) { 
            // 取得左右滑动时手指松开的X坐标 
            touchUpX = event.getX(); 
           
            if (touchUpX - touchDownX > 80) { 
                // 从右往左,看前一个View 
            	Log.v("ChatFaceGridViewFlipper", " 从右往左,看前一个View");
            	// 设置View切换的动画 
        		viewFlipper.setInAnimation(AnimationUtils.loadAnimation(c, 
                        android.R.anim.slide_in_left)); 
                viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(c, 
                        android.R.anim.slide_out_right)); 
                viewFlipper.showPrevious();
                Log.v("ChatFaceGridViewFlipperOnTouchListener__position", String.valueOf(position));
                ((ChatFacePageImageView)mrlFacePageImageView).setPageImageView(numCount, position, resId,false);
            } else if (touchDownX - touchUpX > 80) { 
            	// 从左往右,看后一个View 
            	Log.v("ChatFaceGridViewFlipper", " 从左往右,看后一个View");
            	viewFlipper.setInAnimation(AnimationUtils.loadAnimation(c, 
                        R.anim.slide_in_right)); 
                viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(c, 
                        R.anim.slide_out_left));
                viewFlipper.showNext();
                Log.v("ChatFaceGridViewFlipperOnTouchListener__position", String.valueOf(position));
                ((ChatFacePageImageView)mrlFacePageImageView).setPageImageView(numCount, position, resId,true);
            } 
           // ChatFacePageImageView cfpRl=new ChatFacePageImageView(c);
           // if(position<numCount){
           // cfpRl.setPageImageView(numCount, position, resId);
            //}
           
            return false; 
        }
		return false; 
	}


相差很小,就是把
MotionEvent.ACTION_UP的返回值改为了false 
这样就可以执行多个listener了


再看看我的listner的添加
gridview2[index].setOnItemClickListener(new ChatFaceGridViewItemClickListener());
		gridview2[index].setOnTouchListener(new ChatFaceGridViewFlipperOnTouchListener(index,viewFlipper,this,mrlFacePageImageView));


虽然我用的是自定义的listener但是,还是能轻易的看出来.我这个问题的关键在于touch的返回值,因为点击也是touch事件的一种.
之前返回true导致了后面不能在执行click的事件.而设置成false就完美解决了.

今天搜索了一堆堆关于无法响应的问题的解决方案
不同的代码有不同的问题.大家在以后开发过程中遇到问题看来不能只看表面现象了.还有可能是其他原因.

标签: java Gridview onItemClick

et_highlighter

评论:

园林
2014-08-29 10:33
路过,支持一下博主
jao
2014-08-29 22:49
@园林:感谢支持  已经回访
Copyright © 2012-2013 逝去的青春 蜀ICP备13029051号-1 手机版 安全联盟 Theme by Admin73 sitemap