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

31,660

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;
        }       
    }
}
Share:
31,660
Ads
Author by

Ads

Mobile enthusiastic and an Android developer.

Updated on January 17, 2020

Comments

  • Ads
    Ads over 4 years

    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?

  • Emile
    Emile over 13 years
    Note, That whilst this clarifies the onTouch events, it doesn't strictly answer the issue of the tap event being fired on the list view. I think the issue may lie in your onFling code. You need to ensure that you return true when you happy you've detected a sufficient fling for you needs. That way you capture the event and stop other methods/detections from being interpreted.
  • Ads
    Ads over 13 years
    You found the exact problem of mine...Very sorry i forgot to return true when the event is executed
  • Ads
    Ads over 13 years
    in emulator onfling method is working fine.But in device it is not working? i hope gesture is not recognized by the device. how to make that work?
  • kkudi
    kkudi over 13 years
    I just wanted to say that this worked for me only when I returned true in onDown().