
这是我的old question.不过这次我也提供了我的代码.
我有一个包含不同类型行的ListVIEw.该行可能包含文本,图像,视频或其他内容.如果我点击ImageVIEw(在行内)我将转到另一个活动以全屏显示图像,如果我点击视频(在行内)我将去另一个活动播放他的视频.
我在ListVIEw上实现了从右到左的滑动侦听器.如果我从ListVIEw中的空白区域启动ListVIEw滑动,则滑动工作(下图中的第一行和第二行).但是,如果我从ListVIEw行的项目开始ListVIEw滑动,则滑动不起作用(下图中的第三和第四行).如果我从ImageVIEw和VIDeo中删除了单击事件,那么即使我从ListVIEw行的项目开始滑动,滑动也会起作用,即在这种情况下,滑动在整个ListVIEw上工作,无论我在哪一行进行滑动.
我该怎样摆脱这个问题?我想如果我禁用ListVIEw中所有项目的所有点击事件,就可以实现这一点.怎么会这样?还有其他方法吗?
我想要在ListVIEw上滑动并单击ListVIEw的项目.
SwipeDetector.java – 用于检测ListVIEw上的滑动
public class SwipeDetector implements VIEw.OntouchListener {private SwipeListener swipeListener;private ListVIEw mListVIEw;private int hundred;private boolean motionInterceptdisallowed = false;public static enum Action { LR, // left to right RL, // Right to left TB, // top to bottom BT, // Bottom to top None // Action not found}private static final int HORIZONTAL_MIN_disTANCE = 30; // The minimum// distance for// horizontal swipeprivate static final int VERTICAL_MIN_disTANCE = 80; // The minimum distance// for vertical// swipeprivate float downX, downY, upX, upY; // Coordinatesprivate Action mSwipeDetected = Action.None; // Last actionpublic SwipeDetector(Context context, ListVIEw ListVIEw) { hundred = (int) context.getResources().getDimension(R.dimen.hundred); mListVIEw = ListVIEw;}public boolean swipeDetected() { return mSwipeDetected != Action.None;}public Action getAction() { return mSwipeDetected;}/** * Swipe detection */@OverrIDepublic boolean ontouch(VIEw v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { downX = event.getX(); downY = event.getY(); mSwipeDetected = Action.None; return false; // allow other events like Click to be processed } case MotionEvent.ACTION_MOVE: { upX = event.getX(); upY = event.getY(); float deltaX = downX - upX; float deltaY = downY - upY; float absX = Math.abs(deltaX); float absY = Math.abs(deltaY); if((absX >= (3 * absY)) && absX > HORIZONTAL_MIN_disTANCE && mListVIEw != null && !motionInterceptdisallowed) { mListVIEw.requestdisallowIntercepttouchEvent(true); motionInterceptdisallowed = true; } if((absX >= (3 * absY)) && absX <= hundred) { if (deltaX > 0) { mSwipeDetected = Action.RL; swipeListener.onSwipe(MotionEvent.ACTION_MOVE, Action.RL, absX); } } return false; } case MotionEvent.ACTION_UP: swipeListener.onSwipe(MotionEvent.ACTION_UP, Action.BT, 0); if (mListVIEw != null) { mListVIEw.requestdisallowIntercepttouchEvent(false); motionInterceptdisallowed = false; } return false; case MotionEvent.ACTION_CANCEL: return true; } return false;}/** * Set chat send Listener * @param Listener */public voID setSwipeListener(SwipeListener Listener) { swipeListener = Listener;}public interface SwipeListener { voID onSwipe(int event, Action action, float x);}}这就是我在ListVIEw上设置SwipeDetector的方法
final SwipeDetector swipeDetector = new SwipeDetector(SwipeActivity.this, mListVIEw); swipeDetector.setSwipeListener(mSwipeListener); mListVIEw.setontouchListener(swipeDetector);我的Activity实现了SwipeDetector.SwipeListener
以下是onSwipe()方法的重写
@OverrIDepublic voID onSwipe(int event, SwipeDetector.Action action, float x) { switch (event) { case MotionEvent.ACTION_MOVE: System.out.println("List move"); break; case MotionEvent.ACTION_UP: System.out.println("List up"); break; }}在我的适配器中,我在TextVIEw,ImageVIEw和VIDeoVIEw上设置onClickListener()
holder.mTextVIEw.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { System.out.println("item textvIEw click"); } });holder.mImageVIEw.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { System.out.println("item imagevIEw click"); } });holder.mVIDeoVIEw.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { System.out.println("item vIDeovIEw click"); } });当我从ListVIEw的空白区域开始滑动时,ListVIEw的滑动侦听器会捕获它.但是,当我从TextVIEw / ImageVIEw / VIDeoVIEw开始滑动时,会触发VIEw的onClickListener,而不是父类(ListVIEw的)ontouchListener().
我该如何实现呢?我希望当我点击ListVIEw的项目时,该项目的onClick应该被触发,当我在ListVIEw的项目上滑动时,ListVIEw的onSwipe应该被触发.
解决方法:
这对于Listitem的onClickListener和List的SwipeListener都不可能,因为它会在触摸时考虑VIEw之间产生歧义
您使用OnSwipetouchListener实现ontouchListener
OnSwipetouchListener.java
import androID.vIEw.GestureDetector;import androID.vIEw.GestureDetector.SimpleOnGestureListener;import androID.vIEw.MotionEvent;import androID.vIEw.VIEw;import androID.vIEw.VIEw.OntouchListener;public class OnSwipetouchListener implements OntouchListener { private final GestureDetector gestureDetector; public OnSwipetouchListener (Context ctx){ gestureDetector = new GestureDetector(ctx, new GestureListener()); } private final class GestureListener extends SimpleOnGestureListener { private static final int SWIPE_THRESHolD = 100; private static final int SWIPE_VELociTY_THRESHolD = 100; @OverrIDe public boolean onDown(MotionEvent e) { return true; } @OverrIDe public boolean onFling(MotionEvent e1, MotionEvent e2, float veLocityX, float veLocityY) { boolean result = false; try { float diffY = e2.getY() - e1.getY(); float diffX = e2.getX() - e1.getX(); if (Math.abs(diffX) > Math.abs(diffY)) { if (Math.abs(diffX) > SWIPE_THRESHolD && Math.abs(veLocityX) > SWIPE_VELociTY_THRESHolD) { if (diffX > 0) { onSwipeRight(); } else { onSwipeleft(); } } result = true; } else if (Math.abs(diffY) > SWIPE_THRESHolD && Math.abs(veLocityY) > SWIPE_VELociTY_THRESHolD) { if (diffY > 0) { onSwipeBottom(); } else { onSwipetop(); } } result = true; } catch (Exception exception) { exception.printstacktrace(); } return result; } } public voID onSwipeRight() { } public voID onSwipeleft() { } public voID onSwipetop() { } public voID onSwipeBottom() { }}并在Listitem上使用OnSwipetouchListener
Listitem.setontouchListener(new OnSwipetouchListener() { public voID onSwipeleft() { //stuff to do List vIEw left swipe Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show(); } public boolean ontouch(VIEw v, MotionEvent event) { //stuff to do on List item click return gestureDetector.ontouchEvent(event); } });}); //to get click events 总结 以上是内存溢出为你收集整理的android – ListView上的SwipeListener和ListView项目上的ClickListener全部内容,希望文章能够帮你解决android – ListView上的SwipeListener和ListView项目上的ClickListener所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)