天天看點

關于ListView觸摸事件和點選Item事件沖突解決方法

前言

原創文章,歡迎轉載,請保留出處。
有任何錯誤、疑問或者建議,歡迎指出。
我的郵箱:[email protected]
           

當我們重寫ListView的OnTouchEvent方法時,通常都會switch一下MotionEvent的action,檢查符合一定條件是return true,比如重寫ListView添加下拉重新整理時出現下拉重新整理時容易誤點Item出發點選事件或者出發長按事件。

例子

先看看下面的代碼,我忽略了非關鍵部分:

@Override
  public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {

      case MotionEvent.ACTION_DOWN :
       // ...
        break;

      case MotionEvent.ACTION_MOVE :
        if (...) {
            // 下拉重新整理邏輯...
          return true;//這裡攔截了觸摸事件
        }
        break;

      case MotionEvent.ACTION_UP :
            // ...
        break;

    }

    return super.onTouchEvent(ev);
  }
           

分析

發現OnTouchEvent中條件出發下拉重新整理邏輯後直接

return true;

而沒有執行到

super.onTouchEvent(ev);

方法,在

super.onTouchEvent(ev);

方法中有可以解決ListView觸摸事件和點選Item事件沖突的代碼,可以防止下拉重新整理時容易誤點Item出發點選事件或者出發長按事件。

解決

return ture;

前調用

super.onTouchEvent(ev);

,代碼如下:

@Override
  public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {

      case MotionEvent.ACTION_DOWN :
       // ...
        break;

      case MotionEvent.ACTION_MOVE :
        if (...) {
            // 下拉重新整理邏輯...
          super.onTouchEvent(ev);//調用父類方法,防止滑動時觸發點選事件
          return true;//這裡攔截了觸摸事件
        }
        break;

      case MotionEvent.ACTION_UP :
            // ...
        break;

    }

    return super.onTouchEvent(ev);
  }
           

繼續閱讀