2013-12-07 29 views
1

我修改下面的代码:修改SwipeDismissListViewTouchListener的支持刷卡或拖动打开/关闭

https://github.com/romannurik/Android-SwipeToDismiss/blob/master/src/com/example/android/swipedismiss/SwipeDismissListViewTouchListener.java

首先,我只是想只要触摸指向拖动ListView的孩子。但是,一旦应用它后,似乎我的未来在ListView上点击搞砸了,我无法再移动那个孩子。它的行为就好像listview不能正确接收触摸了,或者感觉到listview没有接收到触摸了。

我看到类似的行为,如果我直接修改上述代码并注释掉从列表视图关闭单元格的方法调用。以下是我的首发代码:

public class ListItemSwipeListener implements View.OnTouchListener 
{ 
    private String TAG = "ListItemSwipeListener"; 
    // Cached ViewConfiguration and system-wide constant values 
    private int mSlop; 
    private long mAnimationTime; 

    private boolean mPaused; 
    private boolean mSwiping; 

    // Fixed properties 
    private ListView mListView; 
    private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero 

    // Transient properties 
    private float mDownX; 
    private VelocityTracker mVelocityTracker; 
    private View mDownView; 

    public ListItemSwipeListener(ListView listView) 
    { 
     this.mListView = listView; 

     ViewConfiguration vc = ViewConfiguration.get(listView.getContext()); 
     mSlop = vc.getScaledTouchSlop(); 
     mAnimationTime = listView.getContext().getResources().getInteger(android.R.integer.config_shortAnimTime); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent motionEvent) 
    { 
     if (mViewWidth < 2) 
     { 
      mViewWidth = mListView.getWidth(); 
     } 

     switch(motionEvent.getActionMasked()) 
     { 
      case MotionEvent.ACTION_DOWN: 
      { 
       if (mPaused) 
       { 
        return false; 
       } 

       // Find the child view that was touched (perform a hit test) 
       Rect rect = new Rect(); 
       int childCount = mListView.getChildCount(); 
       int[] listViewCoords = new int[2]; 
       mListView.getLocationOnScreen(listViewCoords); 
       int x = (int) motionEvent.getRawX() - listViewCoords[0]; 
       int y = (int) motionEvent.getRawY() - listViewCoords[1]; 
       View child; 
       for (int i = 0; i < childCount; i++) { 
        child = mListView.getChildAt(i); 
        child.getHitRect(rect); 
        if (rect.contains(x, y)) { 
         mDownView = child;       
         Log.d(TAG, "index: "+i); 
         break; 
        } 
       } 

       if (mDownView != null) { 
        mDownX = motionEvent.getRawX();      

        mVelocityTracker = VelocityTracker.obtain(); 
        mVelocityTracker.addMovement(motionEvent);      
       } 

       return false; 
      } 
      case MotionEvent.ACTION_MOVE: 
      { 
       if (mVelocityTracker == null || mPaused) 
       { 
        break; 
       } 
       mVelocityTracker.addMovement(motionEvent); 
       float deltaX = motionEvent.getRawX() - mDownX; 
       if (Math.abs(deltaX) > mSlop) 
       { 
        mSwiping = true; 
       } 

       if (mSwiping) 
       { 
        mDownView.setTranslationX(deltaX); 

        return true; 
       } 
       break;     
      } 
      case MotionEvent.ACTION_UP: 
      { 
       if (mVelocityTracker == null) 
       { 
        break; 
       }       

       float deltaX = motionEvent.getRawX() - mDownX;     
       mVelocityTracker.recycle(); 
       mVelocityTracker = null; 
       mDownX = 0; 
       mDownView = null;     
       mSwiping = false; 
       break; 
      } 
      case MotionEvent.ACTION_CANCEL: 
      { 
       break; 
      } 
     } 
     return false; 
    } 

    public AbsListView.OnScrollListener makeScrollListener() 
    { 
     return new AbsListView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(AbsListView absListView, int scrollState) { 
       setEnabled(scrollState != AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); 
      } 

      @Override 
      public void onScroll(AbsListView absListView, int i, int i1, int i2) { 
      } 
     }; 
    } 

    public void setEnabled(boolean enabled) 
    { 
     mPaused = !enabled; 
    } 
} 

回答