From 9407e393f9bd3507df8166af5fbbd16f9319ebb7 Mon Sep 17 00:00:00 2001 From: yingleiw Date: Wed, 29 Jan 2020 11:15:19 -0800 Subject: [PATCH] Fix TYPE_VIEW_SCROLLED event in AsListView and ListView We should always send TYPE_VIEW_SCROLLED event when scroll. This applies to ACTION_SHOW_ON_SCREEN. And we also need the scroll event when the first visible item and last visibile item don't change. Fix: 147907655, 147282475 Test: tested b/147282475 is fixed (this bug is not related to ACTION_SHOW_ON_SCREEN, it is the scroll forward action). Change-Id: I2069dc3ee692042ff87867db9837e85ac1d8dd26 --- core/java/android/widget/AbsListView.java | 26 ++++------------------- core/java/android/widget/ListView.java | 4 ++++ 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 4752eadfe3852..9f03d956f22c1 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -756,9 +756,6 @@ public abstract class AbsListView extends AdapterView implements Te */ private ListItemAccessibilityDelegate mAccessibilityDelegate; - private int mLastAccessibilityScrollEventFromIndex; - private int mLastAccessibilityScrollEventToIndex; - /** * Track the item count from the last time we handled a data change. */ @@ -1520,25 +1517,10 @@ public abstract class AbsListView extends AdapterView implements Te onScrollChanged(0, 0, 0, 0); // dummy values, View's implementation does not use these. } - /** @hide */ - @Override - public void sendAccessibilityEventUnchecked(AccessibilityEvent event) { - // Since this class calls onScrollChanged even if the mFirstPosition and the - // child count have not changed we will avoid sending duplicate accessibility - // events. - if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { - final int firstVisiblePosition = getFirstVisiblePosition(); - final int lastVisiblePosition = getLastVisiblePosition(); - if (mLastAccessibilityScrollEventFromIndex == firstVisiblePosition - && mLastAccessibilityScrollEventToIndex == lastVisiblePosition) { - return; - } else { - mLastAccessibilityScrollEventFromIndex = firstVisiblePosition; - mLastAccessibilityScrollEventToIndex = lastVisiblePosition; - } - } - super.sendAccessibilityEventUnchecked(event); - } + /** + * A TYPE_VIEW_SCROLLED event should be sent whenever a scroll happens, even if the + * mFirstPosition and the child count have not changed. + */ @Override public CharSequence getAccessibilityClassName() { diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 79ec680f4c525..3c3daa3c70011 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -3255,6 +3255,9 @@ public class ListView extends AbsListView { */ @UnsupportedAppUsage private void scrollListItemsBy(int amount) { + int oldX = mScrollX; + int oldY = mScrollY; + offsetChildrenTopAndBottom(amount); final int listBottom = getHeight() - mListPadding.bottom; @@ -3327,6 +3330,7 @@ public class ListView extends AbsListView { recycleBin.fullyDetachScrapViews(); removeUnusedFixedViews(mHeaderViewInfos); removeUnusedFixedViews(mFooterViewInfos); + onScrollChanged(mScrollX, mScrollY, oldX, oldY); } private View addViewAbove(View theView, int position) {