2011-01-27 2 views
10

J'ai un ListActivity la suivante:Android ListView avec OnItemClickListener ET GestureDetector

public class ShowDayActivity extends ListActivity implements OnItemClickListener { 
    private GestureDetector gestureDetector; 
    private View.OnTouchListener gestureListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.day); 
     registerForContextMenu(getListView()); 

     gestureDetector = new GestureDetector(new MyGestureDetector()); 
     gestureListener = new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return gestureDetector.onTouchEvent(event); 
      } 
     }; 

     getListView().setOnItemClickListener(this); 
     getListView().setOnTouchListener(gestureListener); 
    } 

    @SuppressWarnings("static-access") 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     ... 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     ... 
     return super.onContextItemSelected(item); 
    } 

    Override 
    public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { 
     editEvent(pos); 
    } 

    class MyGestureDetector extends SimpleOnGestureListener { 
     private static final int SWIPE_MIN_DISTANCE = 120; 
     private static final int SWIPE_MAX_OFF_PATH = 250; 
     private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, 
           float velocityX, float velocityY) { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { 
       return false; 
      } 
      // right to left swipe 
      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Log.d("ICS-Calendar", "Fling left"); 
       return true; 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Log.d("ICS-Calendar", "Fling right"); 
       return true; 
      } 

      return false; 
     } 
    } 
} 

Le contextListener (long clic) sur les listItems fonctionne parfaitement. Le GestureDetector détecte un fling bien, mais une fois que c'est fait avec sa logique, le menu contextuel s'ouvre, ce qui n'est évidemment pas ce que je veux. Des idées de ce que je fais mal, ou ce que je pourrais faire à ce sujet?

Répondre

8

Normalement, vous devez appeler cancelLongPress() méthode pour la vue et tous les enfants de vue après onFling a été détectée. Mais pour AbsListView cette méthode ne rien :(

Mais j'ai trouvé de solution pour: dans le rappel onFling, après toutes les choses ont été traitées, faites-le pour votre prochain ListView objet:

.
Event cancelEvent = Event.obtain(ev2); 
cancelEvent.setAction(MotionEvent.ACTION_UP); 
listView.onTouchEvent(cancelEvent); 
+1

cool appel alternatif si vous n'avez pas ev2: list.onTouchEvent (MotionEvent.obtain (0, 0, MotionEvent.ACTION_CANCEL, 0, 0, 0)); –

6
public class GestureDemoActivity extends ListActivity { 

    public void onCreate(Bundle savedInstanceState) { 
     // something init code. 
     getListView().setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (mDetector.onTouchEvent(event)) { 
        MotionEvent cancelEvent = MotionEvent.obtain(event); 
        cancelEvent.setAction(MotionEvent.ACTION_CANCEL); 
        v.onTouchEvent(cancelEvent); 
        return true; 
       } 
       return false; 
      } 
     }); 
    } 
} 
+2

Merci, il résolu mon problème :-) – RRTW

Questions connexes