Android ListView与OnItemClickListener和GestureDetector

前端之家收集整理的这篇文章主要介绍了Android ListView与OnItemClickListener和GestureDetector前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个以下ListActivity:
  1. public class ShowDayActivity extends ListActivity implements OnItemClickListener {
  2. private GestureDetector gestureDetector;
  3. private View.OnTouchListener gestureListener;
  4.  
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8.  
  9. setContentView(R.layout.day);
  10. registerForContextMenu(getListView());
  11.  
  12. gestureDetector = new GestureDetector(new MyGestureDetector());
  13. gestureListener = new View.OnTouchListener() {
  14. @Override
  15. public boolean onTouch(View v,MotionEvent event) {
  16. return gestureDetector.onTouchEvent(event);
  17. }
  18. };
  19.  
  20. getListView().setOnItemClickListener(this);
  21. getListView().setOnTouchListener(gestureListener);
  22. }
  23.  
  24. @SuppressWarnings("static-access")
  25. @Override
  26. public boolean onOptionsItemSelected(MenuItem item) {
  27. ...
  28. return super.onOptionsItemSelected(item);
  29. }
  30.  
  31. @Override
  32. public boolean onContextItemSelected(MenuItem item) {
  33. ...
  34. return super.onContextItemSelected(item);
  35. }
  36.  
  37. Override
  38. public void onItemClick(AdapterView<?> parent,View v,int pos,long id) {
  39. editEvent(pos);
  40. }
  41.  
  42. class MyGestureDetector extends SimpleOnGestureListener {
  43. private static final int SWIPE_MIN_DISTANCE = 120;
  44. private static final int SWIPE_MAX_OFF_PATH = 250;
  45. private static final int SWIPE_THRESHOLD_VELOCITY = 200;
  46.  
  47. @Override
  48. public boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY) {
  49. if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
  50. return false;
  51. }
  52. // right to left swipe
  53. if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
  54. Log.d("ICS-Calendar","Fling left");
  55. return true;
  56. } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
  57. Log.d("ICS-Calendar","Fling right");
  58. return true;
  59. }
  60.  
  61. return false;
  62. }
  63. }
  64. }

listItems上的contextListener(long-click)完美地工作.今天我添加了gestureListener和Detector,它也是这样,但是:

GestureDetector检测到一切都没有了,但是在完成了逻辑之后,会打开上下文菜单,这显然不是我想要的.任何想法我做错了,还是我可以做什么?

解决方法

通常,您需要调用cancelLongPress()方法,并检测到onFling后的所有视图的子项.但是对于AbsListView,这个方法什么也不做:(

但是我已经找到了解决方法:在onFling回调中,处理完所有内容后,为ListView对象执行下一步:

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

猜你在找的Android相关文章