Frage

ich habe ein Listview und umgesetzt Onclick und auch ist onfling.problem, wenn ich Sie schleudern (Swipe links nach rechts), Onclick-Ereignis von Listview wird auch executed.How bekommen dieses Problem zu lösen? , wie man differenzierbare touch (tap) und schleudern (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. Ist es möglich? die OnClickListener von Listview und das Schreiben der gleichen Logik in jedem onTouchEvent zu kommentieren? aber noch habe ich keinen Zweifel, dass onFling rufen OnTouch. Bin ich richtig?

War es hilfreich?

Lösung

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;
        }       
    }
}

Andere Tipps

Catch the Multi Click Event

I Solve this problem by this way, It is pretty Simple!

Object.setOnTouchListener( new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                int action = event.getActionMasked();

                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        // button press
                        initialX = event.getX();
                        initialY = event.getY();
                        break;

                    case MotionEvent.ACTION_UP:

                        //button release
                        float finalX = event.getX();
                        float finalY = event.getY();

                       if (initialX > finalX)
                       {
                           //Right to Left swipe performed
                       }
                       if (initialX < finalX)
                       {
                           //Left to Right swipe performed
                       }
                       if (initialY < finalY) {
                           //Log.d( TAG, "Up to Down swipe performed" );
                       }
                       if (initialY > finalY) {
                           //Log.d( TAG, "Down to Up swipe performed" );
                       }
                       break;
                   case MotionEvent.ACTION_CANCEL:
                       Log.d( TAG, "Action was CANCEL" );
                       break;
                   case MotionEvent.ACTION_OUTSIDE:
                       Log.d( TAG, "Movement occurred outside bounds of current screen element" );
                       break;
                   case MotionEvent.ACTION_MOVE:
                       Toast.makeText(getApplicationContext(), "Action was MOVE",Toast.LENGTH_SHORT ).show();
                       break;


                }
                return true;
            }
        } );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top