2011-01-27 7 views
10

ho un il seguente ListActivity:ListView Android con OnItemClickListener E 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; 
     } 
    } 
} 

Il contextListener (lungo-clic) sui listItems funziona perfettamente. Oggi ho aggiunto il gestureListener e il rilevatore, che funziona anche, MA:

GestureDetector rileva un fling, ma dopo averlo fatto con la sua logica, si apre il menu di scelta rapida, che ovviamente non è quello che voglio. Qualche idea su cosa sto facendo male o cosa potrei fare a riguardo?

risposta

8

Normalmente, è necessario chiamare cancelLongPress) metodo (per la vista e tutti i figli di vista dopo la rilevazione di onFling. Ma per AbsListView questo metodo non fare nulla :(

Ma ho trovato soluzione per esso: in onFling richiamata, dopo tutte le cose sono state elaborate, fare la prossima per il vostro ListView oggetto:

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

fredda chiamata alternativa, se non si dispone di 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

Grazie, è risolto il mio problema :-) – RRTW