React native Android ScrollView scrollTo not working

前端 未结 4 830
太阳男子
太阳男子 2020-12-15 17:00

I am trying to use a horizontal ScrollView in React Native for Android, where the starting position is in the middle of the scrolling images rather than (0,

相关标签:
4条回答
  • 2020-12-15 17:07

    I wanted to avoid using delays and timers so after a bit of digging I found that using onLayout works very smooth:

    scrollToInitialPosition = () => {
      this.scrollViewRef.scrollTo({ y: 100 });
    }
    ...
    <ScrollView
      ref={(ref) => { this.scrollViewRef = ref; }}
      onLayout={this.scrollToInitialPosition}
    />
    
    0 讨论(0)
  • 2020-12-15 17:17

    This works on React Native 0.44.0. Thanks for the hint @Eldelshell. It also seems to work with any timeout value. At least on the emulator. I found that the answer involving InteractionManager.runAfterInteractions did nothing to fix the issue but perhaps that's a difference in versions.

    componentDidMount() {
      setTimeout(() => {
        this._scroll.scrollTo({y: 100})
      }, 1)
    }
    
    0 讨论(0)
  • 2020-12-15 17:22

    Thanks @David Nathan, using InteractionManager works for me.
    also note that unlike setTimeout , runAfterInteractions will not delay active animations.

    From InteractionManager docs

    0 讨论(0)
  • 2020-12-15 17:23

    I had the same issue, and wasted several hours no it:

    • 1: in android, ScrollView can scroll only when its size < content's size

    • 2: in react native android, if you call ScrollView.scrollTo() in componentDidMount, it won't work, because ScrollView has a layout animation when create, you can find it in ReactScrollView.java

    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // Call with the present values in order to re-layout if necessary
        scrollTo(getScrollX(), getScrollY());
    }
    

    so, you must delay it after the animation

    componentDidMount() {
        InteractionManager.runAfterInteractions(() => {
          this.myScroll.scrollTo(100);
            console.log("called DidMount");
        })  
    }
    
    0 讨论(0)
提交回复
热议问题