16 Stimmen

Wie kann man sowohl ontouch als auch onfling in einer Listenansicht implementieren?

Ich habe eine listview und implementiert onclick und auch onfling.problem ist, wenn ich fling (Streichen von links nach rechts), onclick Ereignis der listview ist auch immer ausgeführt.how zu overCome dieses Problem? Wie unterscheidet man Berühren (Tippen) und Streichen (Wischen) in der Listenansicht?

     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? den OnClickListener von ListView zu kommentieren und die gleiche Logik in jedem onTouchEvent zu schreiben? aber noch habe ich keinen Zweifel, dass onFling onTouch aufrufen wird. Liege ich richtig?

20voto

Emile Punkte 11106

Pseudocode-Antwort zur Verdeutlichung der obigen Kommentare. Wie wird die onTouch-Methode des MySimpleGestureListener aufgerufen.

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

0voto

Sohaib Aslam Punkte 1051

Fangen Sie das Multi-Click-Ereignis

Ich löse dieses Problem auf diese Weise, es ist ziemlich einfach!

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X