逝去的青春
Gridview的onItemClick事件无响应
2014-8-21 jao
思路来自于文文章: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就完美解决了.



今天搜索了一堆堆关于无法响应的问题的解决方案

不同的代码有不同的问题.大家在以后开发过程中遇到问题看来不能只看表面现象了.还有可能是其他原因.



评论:
jao
2014-08-29 22:49 回复
@园林:感谢支持  已经回访
园林
2014-08-29 10:33 回复
路过,支持一下博主