2011-01-27 4 views
10

У меня есть следующий ListActivity:Android ListView с OnItemClickListener И 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; 
     } 
    } 
} 

contextListener (длинный клик) на ListItems работает отлично. Сегодня я добавил gestureListener и Detector, который тоже работает, НО:

GestureDetector обнаруживает бросок вправо, но после того, как это сделано с его логикой, открывается контекстное меню, которое явно не то, что я хочу. Любые идеи, что я делаю неправильно, или что я могу сделать с этим?

ответ

8

Обычно, вам нужно вызвать cancelLongPress() метод для просмотра и дети все просмотреть после onFling было обнаружено. Но для AbsListView этот метод ничего не делать :(

Но я нашел обходной путь для этого: в onFling обратного вызова, после того, как все вещи были обработаны, сделать следующий за ListView объекта:

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

Круто Альтернативный вызов, если у вас нет эВ2: 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

Спасибо, это решило мой проблема :-) – RRTW

Смежные вопросы