From 8de86a0d65dce976bdf4d56486ce8f78a7ed68f2 Mon Sep 17 00:00:00 2001 From: Kudo Chien Date: Fri, 29 Jan 2016 01:16:40 -0800 Subject: [PATCH] Add onPageScrollStateChanged for ViewPagerAndroid Summary: I have an issue when combining `PullToRefreshViewAndroid` and `ViewPagerAndroid`. `ViewPagerAndroid` will not able to scroll that gesture handler is being taken by `PullToRefreshViewAndroid` One solution is to disable `PullToRefreshViewAndroid` if `ViewPagerAndroid` is scrolling (i.e. not idle). [Reference solution here](http://stackoverflow.com/a/29946734/2590265) So here need to expose the `onPageScrollStateChanged` event. Some code referenced from DrawerLayoutAndroid, especially the `VIEWPAGER_PAGE_SCROLL_STATES` array. Please feel free give me comments. Thanks. Closes https://github.com/facebook/react-native/pull/5026 Reviewed By: svcscm Differential Revision: D2830623 Pulled By: andreicoman11 fb-gh-sync-id: c2a6920c6f4c7daab0115f13864db83b93b31abf --- .../ViewPagerAndroidExample.android.js | 11 +++++ .../ViewPager/ViewPagerAndroid.android.js | 25 ++++++++++ .../PageScrollStateChangedEvent.java | 49 +++++++++++++++++++ .../react/views/viewpager/ReactViewPager.java | 17 ++++++- .../viewpager/ReactViewPagerManager.java | 1 + 5 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/views/viewpager/PageScrollStateChangedEvent.java diff --git a/Examples/UIExplorer/ViewPagerAndroidExample.android.js b/Examples/UIExplorer/ViewPagerAndroidExample.android.js index e4f33458e..0e672ee8c 100644 --- a/Examples/UIExplorer/ViewPagerAndroidExample.android.js +++ b/Examples/UIExplorer/ViewPagerAndroidExample.android.js @@ -25,6 +25,8 @@ var { ViewPagerAndroid, } = React; +import type { ViewPagerScrollState } from 'ViewPagerAndroid'; + var PAGES = 5; var BGCOLOR = ['#fdc08e', '#fff6b9', '#99d1b7', '#dde5fe', '#f79273']; var IMAGE_URIS = [ @@ -114,6 +116,10 @@ var ViewPagerAndroidExample = React.createClass({ this.setState({progress: e.nativeEvent}); }, + onPageScrollStateChanged: function(state : ViewPagerScrollState) { + this.setState({scrollState: state}); + }, + move: function(delta) { var page = this.state.page + delta; this.go(page); @@ -155,6 +161,7 @@ var ViewPagerAndroidExample = React.createClass({ initialPage={0} onPageScroll={this.onPageScroll} onPageSelected={this.onPageSelected} + onPageScrollStateChanged={this.onPageScrollStateChanged} ref={viewPager => { this.viewPager = viewPager; }}> {pages} @@ -170,6 +177,7 @@ var ViewPagerAndroidExample = React.createClass({ enabled={true} onPress={() => this.setState({animationsAreEnabled: true})} /> } + ScrollState[ {this.state.scrollState} ]