From 005c0a445e32dfbf18bf93d209da857604925a58 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Tue, 30 Mar 2010 16:26:36 -0700 Subject: [PATCH] Fix bug 2523622 - ListView invokes onItemClick for disabled adapter items AbsListView was relying on TOUCH_MODE_DOWN to signal that the item was enabled, but onInterceptTouchEvent uses it for other purposes. Check before dispatching the event. Change-Id: I6babd3872cb51ebdba8e97a3b349e0cc08cd1279 --- core/java/android/widget/AbsListView.java | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index d615fd026912e..8ef2aebffd4a9 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1688,11 +1688,12 @@ public abstract class AbsListView extends AdapterView implements Te // bail out before bad things happen if (mDataChanged) return; - if (mAdapter != null && mItemCount > 0 && - mClickMotionPosition != INVALID_POSITION && - mClickMotionPosition < mAdapter.getCount() && sameWindow()) { - performItemClick(mChild, mClickMotionPosition, getAdapter().getItemId( - mClickMotionPosition)); + final ListAdapter adapter = mAdapter; + final int motionPosition = mClickMotionPosition; + if (adapter != null && mItemCount > 0 && + motionPosition != INVALID_POSITION && + motionPosition < adapter.getCount() && sameWindow()) { + performItemClick(mChild, motionPosition, adapter.getItemId(motionPosition)); } } } @@ -2118,8 +2119,8 @@ public abstract class AbsListView extends AdapterView implements Te mPendingCheckForTap : mPendingCheckForLongPress); } mLayoutMode = LAYOUT_NORMAL; - mTouchMode = TOUCH_MODE_TAP; - if (!mDataChanged) { + if (!mDataChanged && mAdapter.isEnabled(motionPosition)) { + mTouchMode = TOUCH_MODE_TAP; setSelectedPositionInt(mMotionPosition); layoutChildren(); child.setPressed(true); @@ -2141,12 +2142,12 @@ public abstract class AbsListView extends AdapterView implements Te mTouchMode = TOUCH_MODE_REST; } }, ViewConfiguration.getPressedStateDuration()); + } else { + mTouchMode = TOUCH_MODE_REST; } return true; - } else { - if (!mDataChanged) { - post(performClick); - } + } else if (!mDataChanged && mAdapter.isEnabled(motionPosition)) { + post(performClick); } } mTouchMode = TOUCH_MODE_REST;