Search code examples
androidlistviewgestureswipeontouchlistener

how to implement both ontouch and also onfling in a same listview?


i have a listview and implemented onclick and also onfling.problem is when i do fling(swipe left to right), onclick event of listview is also getting executed.How to overCome this problem? how to differentiate touch(tap) and fling(swipe) in listview?

     listClickListener = new OnItemClickListener() {

           public void onItemClick(AdapterView<?> parent, View v,int position, long id) {
            //Job of Onclick Listener     
           }
      };
       mContactList.setOnItemClickListener(listClickListener); 
        mContactList.setAdapter(adapter);
        // Gesture detection 
        gestureDetector = new GestureDetector(new MyGestureDetector(prosNos)); 
         gestureListener = new View.OnTouchListener() { 
             public boolean onTouch(View v, MotionEvent event) { 
                 if (gestureDetector.onTouchEvent(event)) { 
                     return true; 
                 } 
                 return false; 
             } 
         }; 

         mContactList.setOnTouchListener(gestureListener); 

        }

     public class MyGestureDetector extends SimpleOnGestureListener { 

        @Override 
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
           // My fling event
           return false;
        }
    }

P.S. Is it possible? to comment the OnClickListener of ListView and writing the same logic in any onTouchEvent? but still I have no doubt that onFling will call onTouch. Am I right?


Solution

  • Pseudo code answer to clarify the above comments. How to have the MySimpleGestureListener's onTouch method called.

    public class GestureExample extends Activity {
    
        protected MyGestureListener myGestureListener;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            myGestureListener = new MyGestureListener(this);
            // or if you have already created a Gesture Detector.
            //   myGestureListener = new MyGestureListener(this, getExistingGestureDetector());
    
    
            // Example of setting listener. The onTouchEvent will now be called on your listener
            ((ListView)findViewById(R.id.ListView)).setOnTouchListener(myGestureListener);
    
    
        }
    
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            // or implement in activity or component. When your not assigning to a child component.
            return myGestureListener.getDetector().onTouchEvent(event); 
        }
    
    
        class MyGestureListener extends SimpleOnGestureListener implements OnTouchListener
        {
            Context context;
            GestureDetector gDetector;
    
            public MyGestureListener()
            {
                super();
            }
    
            public MyGestureListener(Context context) {
                this(context, null);
            }
    
            public MyGestureListener(Context context, GestureDetector gDetector) {
    
                if(gDetector == null)
                    gDetector = new GestureDetector(context, this);
    
                this.context = context;
                this.gDetector = gDetector;
            }
    
    
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    
                return super.onFling(e1, e2, velocityX, velocityY);
            }
    
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
    
                return super.onSingleTapConfirmed(e);
            }
    
    
    
    
    
            public boolean onTouch(View v, MotionEvent event) {
    
                // Within the MyGestureListener class you can now manage the event.getAction() codes.
    
                // Note that we are now calling the gesture Detectors onTouchEvent. And given we've set this class as the GestureDetectors listener 
                // the onFling, onSingleTap etc methods will be executed.
                return gDetector.onTouchEvent(event);
            }
    
    
            public GestureDetector getDetector()
            {
                return gDetector;
            }       
        }
    }