From cf35f47c4d2a8aef525eb308972dcc2840c3bf36 Mon Sep 17 00:00:00 2001 From: Krzysztof Magiera Date: Mon, 26 Oct 2015 11:16:29 -0700 Subject: [PATCH] Support scrollTo with RecycleViewBackedScrollView. Differential Revision: D2581381 fb-gh-sync-id: 830f36f4d62a3097fdf3697a94a22441f11f93ef --- .../RecyclerViewBackedScrollView.java | 29 +++++++++++------ .../RecyclerViewBackedScrollViewManager.java | 32 ++++++++++++++++++- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/recyclerview/RecyclerViewBackedScrollView.java b/ReactAndroid/src/main/java/com/facebook/react/views/recyclerview/RecyclerViewBackedScrollView.java index 22e080c83..5b191eca2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/recyclerview/RecyclerViewBackedScrollView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/recyclerview/RecyclerViewBackedScrollView.java @@ -223,26 +223,37 @@ public class RecyclerViewBackedScrollView extends RecyclerView { } } - @Override - protected void onScrollChanged(int l, int t, int oldl, int oldt) { - super.onScrollChanged(l, t, oldl, oldt); - - ReactListAdapter adapter = (ReactListAdapter) getAdapter(); - + private int calculateAbsoluteOffset() { int offsetY = 0; if (getChildCount() > 0) { View recyclerViewChild = getChildAt(0); int childPosition = getChildAdapterPosition(recyclerViewChild); - offsetY = adapter.getTopOffsetForItem(childPosition) - recyclerViewChild.getTop(); + offsetY = ((ReactListAdapter) getAdapter()).getTopOffsetForItem(childPosition) - + recyclerViewChild.getTop(); } + return offsetY; + } + + /*package*/ void scrollTo(int scrollX, int scrollY, boolean animated) { + int deltaY = scrollY - calculateAbsoluteOffset(); + if (animated) { + smoothScrollBy(0, deltaY); + } else { + scrollBy(0, deltaY); + } + } + + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); ScrollEvent event = new ScrollEvent( getId(), SystemClock.uptimeMillis(), 0, /* offsetX = 0, horizontal scrolling only */ - offsetY, + calculateAbsoluteOffset(), getWidth(), - adapter.getTotalChildrenHeight(), + ((ReactListAdapter) getAdapter()).getTotalChildrenHeight(), getWidth(), getHeight()); ((ReactContext) getContext()).getNativeModule(UIManagerModule.class).getEventDispatcher() diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/recyclerview/RecyclerViewBackedScrollViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/recyclerview/RecyclerViewBackedScrollViewManager.java index 4fd430a1c..3d49de448 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/recyclerview/RecyclerViewBackedScrollViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/recyclerview/RecyclerViewBackedScrollViewManager.java @@ -2,16 +2,21 @@ package com.facebook.react.views.recyclerview; +import javax.annotation.Nullable; + import android.view.View; +import com.facebook.react.bridge.ReadableArray; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.views.scroll.ReactScrollViewCommandHelper; /** * View manager for {@link RecyclerViewBackedScrollView}. */ public class RecyclerViewBackedScrollViewManager extends - ViewGroupManager { + ViewGroupManager + implements ReactScrollViewCommandHelper.ScrollCommandHandler { private static final String REACT_CLASS = "AndroidRecyclerViewBackedScrollView"; @@ -46,4 +51,29 @@ public class RecyclerViewBackedScrollViewManager extends public void removeView(RecyclerViewBackedScrollView parent, View child) { parent.removeViewFromAdapter(child); } + + /** + * Provides implementation of commands supported by {@link ReactScrollViewManager} + */ + @Override + public void receiveCommand( + RecyclerViewBackedScrollView view, + int commandId, + @Nullable ReadableArray args) { + ReactScrollViewCommandHelper.receiveCommand(this, view, commandId, args); + } + + @Override + public void scrollTo( + RecyclerViewBackedScrollView view, + ReactScrollViewCommandHelper.ScrollToCommandData data) { + view.scrollTo(data.mDestX, data.mDestY, true); + } + + @Override + public void scrollWithoutAnimationTo( + RecyclerViewBackedScrollView view, + ReactScrollViewCommandHelper.ScrollToCommandData data) { + view.scrollTo(data.mDestX, data.mDestY, false); + } }