2011-01-27 95 views
10

的Android的ListView我有以下ListActivity:在listItems中与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(长按)完美的作品。今天我添加了gestureListener和Detector,它也起作用,但是:但是:

GestureDetector检测到一个闪动,但是在完成它的逻辑之后,上下文菜单打开,这显然不是我想要的。任何想法我做错了,或者我可能会做什么呢?

回答

8

通常情况下,你需要onFling已检测后要求查看cancelLongPress()方法,而且所有视图的孩子。但对于AbsListView这种方法无能为力:(

但我发现解决方法是:在onFling回调,所有的事情都处理后,做下你的ListView 对象

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

很好的替代通话,如果你没有EV2: list.onTouchEvent(MotionEvent.obtain(0,0,MotionEvent.ACTION_CANCEL,0,0,0)); – 2012-01-26 22:18:07

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 2012-10-02 08:57:19