2011-01-27 27 views
10

Tengo una ListActivity lo siguiente:ListView Android con OnItemClickListener Y 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; 
     } 
    } 
} 

El contextListener (a largo clic) en los ListItems funciona perfectamente. Hoy agregué el gestureListener y Detector, que también funciona, PERO:

El GestureDetector detecta un fling bien, pero después de que se hace con su lógica, se abre el menú contextual, que obviamente no es lo que quiero. ¿Alguna idea de lo que estoy haciendo mal, o qué podría hacer al respecto?

Respuesta

8

Normalmente, es necesario llamar a cancelLongPress ( método) para la visión y todos los hijos de vista después de onFling se ha detectado. Pero para AbsListView este método no hacer nada :(

Pero he encontrado solución para ello: en la devolución de llamada onFling, después de que todas las cosas fueron procesados, haga lo siguiente para su ListView objeto:

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

fresca llamada alternativa si usted no tiene 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

Gracias, es resuelto mi problema :-) – RRTW

Cuestiones relacionadas