用于处理onClick和Swipe手势的Android-Override方法

时间:2014-02-03 18:24:30

标签: android listview onclicklistener ontouchlistener

我正在使用库来实现带有Swipe to Dismiss功能的ListView。 我想知道如何在从库调用自定义侦听器之前拦截事件,以便在ListView的视图中处理onClick事件。 或者如何覆盖OnTouch方法来处理Click事件。

这是图书馆的SwipeDismissListViewTouchListener。 我知道我必须使用case MotionEvent.ACTION_UP:进行评估,但我尝试的所有内容都出错了。如果我消耗点击case MotionEvent.ACTION_DOWN:,它就会再次显示滑动手势。如果我使用点击case MotionEvent.ACTION_UP:它最有效,只需轻扫。

以下是与我实施的活动非常相似的example活动。 在这种情况下,我希望能够在方法view.setOnClickListener中执行public void getView之类的操作而不会阻止滑动手势

1 个答案:

答案 0 :(得分:0)

我知道这是一个相当古老的帖子,但我也遇到了问题,所以我发帖告诉我如何解决它。

首先,我创建了一个实现OnTouchListener的类。该类记录用户首次按下屏幕的位置,然后记录用户将手指抬离屏幕的位置。如果两点之间的距离大于200px,那么我通知监听视图用户向左或向右滑动,否则,我通知听众用户点击了视图。

这是班级:

 public class SmartLinkSwipeDetector implements OnTouchListener {

     //declare needed constants
     private final String CLASS_NAME = getClass().getName();

     private final int MIN_DISTANCE = 200; //TODO - change distance
     private float downX, upX;

     //declare needed variables
     private SmartLinkSwipeDetectorInterface swipeDetector;

     public SmartLinkSwipeDetector(WorkoutSupplementBaseFragment fragment) {
          super();
         testForSwipeDetectorInterface(fragment);
     }

     private void testForSwipeDetectorInterface(WorkoutSupplementBaseFragment fragment) {
         //ensure activity implements interface
         try {
              swipeDetector = (SmartLinkSwipeDetectorInterface) fragment;
         } catch (ClassCastException ex) {
              String errorString = fragment.getClass().getName() + " must implement   SmartLinkSwipeDetectorInterface";
             Log.e(CLASS_NAME, errorString);
             throw new ClassCastException(errorString);
         }
     }

     @Override
     public boolean onTouch(View view, MotionEvent event) {
          switch (event.getAction()) {

               case MotionEvent.ACTION_DOWN:
                    downX = event.getX();
                    return true;

               case MotionEvent.ACTION_UP:
                    upX = event.getX();
                    float deltaX = downX - upX;

                    if (Math.abs(deltaX) > MIN_DISTANCE) {
                         if (deltaX < 0)
                              swipeDetector.swipeRight();
                         else if (deltaX > 0)
                              swipeDetector.swipeLeft();
                    } else {
                         swipeDetector.onShortClick(view);
               }

                    return true;

               default:
                    return true;
         }
     }
 }

确保使用此OnTouchListener的活动或片段实现类似于此的接口:

 public interface SmartLinkSwipeDetectorInterface {

      public void onShortClick(View view);

      public void swipeLeft();

      public void swipeRight();

  }

最后,任何想要实现此OnTouchListener的视图或按钮都需要这样做:

 View.setOnTouchListener(new SmartLinkSwipeDetector(this)); 

这是实现SmartLinkSwipeDetectorInterface的活动或片段