带有OnItemClickListener和GestureDetector的Android ListView

我有以下ListActivity:

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

listItems上的contextListener(长按)可以很好地工作。 今天我添加了gestureListener和Detector,它也有效,但是:

GestureDetector可以检测到fling,但在完成其逻辑后,将打开上下文菜单,这显然不是我想要的。 我有什么想法,或者我可能会做些什么?

通常,您需要在检测到onFling后调用cancelLongPress()方法以查看所有视图的子 。 但对于AbsListView这个方法什么都不做:(

但是我find了它的解决方法:在onFling回调中,处理好所有事情后,为ListView对象执行下一步:

 Event cancelEvent = Event.obtain(ev2); cancelEvent.setAction(MotionEvent.ACTION_UP); listView.onTouchEvent(cancelEvent); 
 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; } }); } }