From de573277bf64703aefdeb52db2c2524b2c241bab Mon Sep 17 00:00:00 2001 From: Jiaqi Wu Date: Thu, 19 Jul 2018 17:00:46 -0700 Subject: [PATCH] Fix Horizontal ScrollView's scroll position during layout changes Summary: Fix the calculation of offsetX in onLayout (ReactHorizontalScrollContainerView.java) that re-positions the updated layout. A private instance variable (oldWidth) is added in order to track the width difference between consecutive updates. (Issue report: https://github.com/facebook/react-native/issues/19979) Reviewed By: mdvacca Differential Revision: D8772780 fbshipit-source-id: 969dcead550f4a3d24d06416b63d960492b7a124 --- .../views/scroll/ReactHorizontalScrollContainerView.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java index bcda65607..e23e53305 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java @@ -14,11 +14,13 @@ import com.facebook.react.modules.i18nmanager.I18nUtil; public class ReactHorizontalScrollContainerView extends ViewGroup { private int mLayoutDirection; + private int mCurrentWidth; public ReactHorizontalScrollContainerView(Context context) { super(context); mLayoutDirection = I18nUtil.getInstance().isRTL(context) ? LAYOUT_DIRECTION_RTL : LAYOUT_DIRECTION_LTR; + mCurrentWidth = 0; } @Override @@ -32,12 +34,12 @@ public class ReactHorizontalScrollContainerView extends ViewGroup { setLeft(newLeft); setRight(newRight); - // Fix the ScrollX position when using RTL language - int offsetX = computeHorizontalScrollRange() - getScrollX(); - // Call with the present values in order to re-layout if necessary HorizontalScrollView parent = (HorizontalScrollView) getParent(); + // Fix the ScrollX position when using RTL language + int offsetX = parent.getScrollX() + getWidth() - mCurrentWidth; parent.scrollTo(offsetX, parent.getScrollY()); } + mCurrentWidth = getWidth(); } }