OSDN Git Service

Fix some mouse + list-item selection/scrolling issues
authorEvan Rosky <erosky@google.com>
Thu, 26 Oct 2017 19:50:33 +0000 (12:50 -0700)
committerEvan Rosky <erosky@google.com>
Mon, 30 Oct 2017 23:07:50 +0000 (16:07 -0700)
Any "touch" interaction now hides selection (since mouse
doesn't enable touch-mode, this wasn't happening anymore;
also, allowing listview to scroll an actual selection
off-screen would be very involved and risky).

The selector hilight remains (since mouse doesn't enter
touch-mode). This is a new scenario, so this change also
makes sure to hide the selector hilight when it's target
view is scrolled off-screen.

Bug: 67881712
Bug: 67720587
Test: Existing CTS tests still pass. Can now click list items
      via mouse even when scrolled. Visually checked that that
      selector hilight is not visible if off-screen.
Change-Id: Ia7b0fd7b247e8d9d9e609364a5500717df648fd9

core/java/android/widget/AbsListView.java

index 170582b..e0c897d 100644 (file)
@@ -3866,6 +3866,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
     private void onTouchDown(MotionEvent ev) {
         mHasPerformedLongPress = false;
         mActivePointerId = ev.getPointerId(0);
+        hideSelector();
 
         if (mTouchMode == TOUCH_MODE_OVERFLING) {
             // Stopped the fling. It is a scroll.
@@ -5226,17 +5227,21 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
         }
 
         mRecycler.fullyDetachScrapViews();
+        boolean selectorOnScreen = false;
         if (!inTouchMode && mSelectedPosition != INVALID_POSITION) {
             final int childIndex = mSelectedPosition - mFirstPosition;
             if (childIndex >= 0 && childIndex < getChildCount()) {
                 positionSelector(mSelectedPosition, getChildAt(childIndex));
+                selectorOnScreen = true;
             }
         } else if (mSelectorPosition != INVALID_POSITION) {
             final int childIndex = mSelectorPosition - mFirstPosition;
             if (childIndex >= 0 && childIndex < getChildCount()) {
-                positionSelector(INVALID_POSITION, getChildAt(childIndex));
+                positionSelector(mSelectorPosition, getChildAt(childIndex));
+                selectorOnScreen = true;
             }
-        } else {
+        }
+        if (!selectorOnScreen) {
             mSelectorRect.setEmpty();
         }