@@ -146,6 +146,8 @@ public void onInvalidated() {
 
     private boolean mHeadersIgnorePadding;
 
+    boolean mHeaderChildBeingPressed = false;
+
     public StickyGridHeadersGridView(Context context) {
         this(context, null);
     }
@@ -270,6 +272,18 @@ public void onScrollStateChanged(AbsListView view, int scrollState) {
     @Override
     public boolean onTouchEvent(MotionEvent ev) {
         final int action = ev.getAction();
+        if (mHeaderChildBeingPressed) {
+            View tempHeader = getHeaderAt(mMotionHeaderPosition);
+            if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+                mMotionHeaderPosition = NO_MATCHED_HEADER;
+                mHeaderChildBeingPressed = false;
+            }
+            if (tempHeader != null) {
+                tempHeader.dispatchTouchEvent(ev);
+                tempHeader.invalidate();
+                invalidate(0, tempHeader.getTop(), getWidth(), tempHeader.getHeight());
+            }
+        }
         switch (action & MotionEvent.ACTION_MASK) {
             case MotionEvent.ACTION_DOWN:
                 if (mPendingCheckForTap == null) {
@@ -280,6 +294,14 @@ public boolean onTouchEvent(MotionEvent ev) {
                 final int y = (int)ev.getY();
                 mMotionY = y;
                 mMotionHeaderPosition = findMotionHeader(y);
+                View tempHeader = getHeaderAt(mMotionHeaderPosition);
+                if (tempHeader != null){
+                    if (tempHeader.dispatchTouchEvent(ev)) {
+                        mHeaderChildBeingPressed = true;
+                    }
+                    tempHeader.invalidate();
+                    invalidate(0, tempHeader.getTop(), getWidth(), tempHeader.getHeight());
+                }
                 if (mMotionHeaderPosition == NO_MATCHED_HEADER
                         || mScrollState == SCROLL_STATE_FLING) {
                     // Don't consume the event and pass it to super because we
@@ -294,15 +316,17 @@ public boolean onTouchEvent(MotionEvent ev) {
                     // Detected scroll initiation so cancel touch completion on
                     // header.
                     mTouchMode = TOUCH_MODE_REST;
-                    final View header = getHeaderAt(mMotionHeaderPosition);
-                    if (header != null) {
-                        header.setPressed(false);
-                    }
-                    final Handler handler = getHandler();
-                    if (handler != null) {
-                        handler.removeCallbacks(mPendingCheckForLongPress);
+                    if (!mHeaderChildBeingPressed) {
+                        final View header = getHeaderAt(mMotionHeaderPosition);
+                        if (header != null) {
+                            header.setPressed(false);
+                        }
+                        final Handler handler = getHandler();
+                        if (handler != null) {
+                            handler.removeCallbacks(mPendingCheckForLongPress);
+                        }
+                        mMotionHeaderPosition = NO_MATCHED_HEADER;
                     }
-                    mMotionHeaderPosition = NO_MATCHED_HEADER;
                 }
                 break;
             case MotionEvent.ACTION_UP:
@@ -314,53 +338,55 @@ public boolean onTouchEvent(MotionEvent ev) {
                 }
 
                 final View header = getHeaderAt(mMotionHeaderPosition);
-                if (header != null && !header.hasFocusable()) {
-                    if (mTouchMode != TOUCH_MODE_DOWN) {
-                        header.setPressed(false);
-                    }
-
-                    if (mPerformHeaderClick == null) {
-                        mPerformHeaderClick = new PerformHeaderClick();
-                    }
-
-                    final PerformHeaderClick performHeaderClick = mPerformHeaderClick;
-                    performHeaderClick.mClickMotionPosition = mMotionHeaderPosition;
-                    performHeaderClick.rememberWindowAttachCount();
+                if (!mHeaderChildBeingPressed) {
+                    if (header != null && !header.hasFocusable()) {
+                        if (mTouchMode != TOUCH_MODE_DOWN) {
+                            header.setPressed(false);
+                        }
 
-                    if (mTouchMode != TOUCH_MODE_DOWN || mTouchMode != TOUCH_MODE_TAP) {
-                        final Handler handler = getHandler();
-                        if (handler != null) {
-                            handler.removeCallbacks(mTouchMode == TOUCH_MODE_DOWN ? mPendingCheckForTap
-                                    : mPendingCheckForLongPress);
+                        if (mPerformHeaderClick == null) {
+                            mPerformHeaderClick = new PerformHeaderClick();
                         }
 
-                        if (!mDataChanged) {
-                            // Got here so must be a tap. The long press would
-                            // have trigger on the callback handler. Probably.
-                            mTouchMode = TOUCH_MODE_TAP;
-                            header.setPressed(true);
-                            setPressed(true);
-                            if (mTouchModeReset != null) {
-                                removeCallbacks(mTouchModeReset);
+                        final PerformHeaderClick performHeaderClick = mPerformHeaderClick;
+                        performHeaderClick.mClickMotionPosition = mMotionHeaderPosition;
+                        performHeaderClick.rememberWindowAttachCount();
+
+                        if (mTouchMode != TOUCH_MODE_DOWN || mTouchMode != TOUCH_MODE_TAP) {
+                            final Handler handler = getHandler();
+                            if (handler != null) {
+                                handler.removeCallbacks(mTouchMode == TOUCH_MODE_DOWN ? mPendingCheckForTap
+                                        : mPendingCheckForLongPress);
                             }
-                            mTouchModeReset = new Runnable() {
-                                @Override
-                                public void run() {
-                                    mTouchMode = TOUCH_MODE_REST;
-                                    header.setPressed(false);
-                                    setPressed(false);
-                                    if (!mDataChanged) {
-                                        performHeaderClick.run();
-                                    }
+
+                            if (!mDataChanged) {
+                                // Got here so must be a tap. The long press would
+                                // have trigger on the callback handler. Probably.
+                                mTouchMode = TOUCH_MODE_TAP;
+                                header.setPressed(true);
+                                setPressed(true);
+                                if (mTouchModeReset != null) {
+                                    removeCallbacks(mTouchModeReset);
                                 }
-                            };
-                            postDelayed(mTouchModeReset,
-                                    ViewConfiguration.getPressedStateDuration());
-                        } else {
-                            mTouchMode = TOUCH_MODE_REST;
+                                mTouchModeReset = new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        mTouchMode = TOUCH_MODE_REST;
+                                        header.setPressed(false);
+                                        setPressed(false);
+                                        if (!mDataChanged) {
+                                            performHeaderClick.run();
+                                        }
+                                    }
+                                };
+                                postDelayed(mTouchModeReset,
+                                        ViewConfiguration.getPressedStateDuration());
+                            } else {
+                                mTouchMode = TOUCH_MODE_REST;
+                            }
+                        } else if (!mDataChanged) {
+                            performHeaderClick.run();
                         }
-                    } else if (!mDataChanged) {
-                        performHeaderClick.run();
                     }
                 }
                 mTouchMode = TOUCH_MODE_REST;