【问题标题】:initialScrollIndex not working for FlatList react nativeinitialScrollIndex 不适用于 FlatList 反应原生
【发布时间】:2017-11-16 08:39:35
【问题描述】:

我遇到了 FlatList 的 initialScrollIndex 的问题 - initialScrollIndex 的参数被简单地忽略并显示第一项。

https://snack.expo.io/Bk1mkK0zZ

【问题讨论】:

  • 我试了一下零食,它到了正确的位置,2。也许默认的 Expo SDK 或其他东西自从你第一次创建它以来已经改变了??
  • 通过设置 getItemLayout 回调明确定义布局帮助我修复了 initialScrollIndex 行为

标签: react-native react-native-flatlist


【解决方案1】:

我使用了 getItemLayout,一切都像魅力一样工作

const getItemLayout=(data, index)=> {
    return { length: wp(100), offset:  wp(100)* index, index };
}

<FlatList
        horizontal
        pagingEnabled
        initialScrollIndex={1}
        snapToAlignment={"start"}
        decelerationRate={"fast"}
        showsHorizontalScrollIndicator={false}
        data={routes}
        getItemLayout={getItemLayout}
        renderItem={rowItem}/>

【讨论】:

    【解决方案2】:

    只需删除以下内容:

    pagingEnabled = { true }
    

    这将修复您的示例。

    【讨论】:

      【解决方案3】:

      使用 RN 0.61.5

      我已经通过设置解决了这个问题:

      • onContentSizeChange 将在平面列表数据更改并呈现所有项目时处理滚动到索引(如果需要,您可以通过设置 initialNumToRender 来处理初始渲染时将呈现多少项目)

      • onScrollToIndexFailed在使用scrollToIndex函数时需要用到:

      <FlatList
          ref={ref => (this.flatList = ref)}
          data={dataArray}
          style={style}
          eyExtractor={(item, index) => String(index)}
          onContentSizeChange={() => {
              if (this.flatList && this.flatList.scrollToIndex && dataArray && dataArray.length) {
                  this.flatList.scrollToIndex({  index: dataArray.length - 1 });
              }
          }}
          onScrollToIndexFailed={() => {}}
          renderItem={({ item, index }) => {
              return (
                  <Text>Stackoverflow Answer</Text>
              );
          }}
      />
      

      【讨论】:

      • 哇,使用onContentSizeChange 是在 SectionList 中唯一对我有用的技巧。谢谢!
      • 对我来说也很好用。我试图使用 getItemLayout 和 initialScrollIndex 但由于某种原因,我的列表在添加或删除值后没有更新。现在它可以工作了。
      【解决方案4】:

      我有同样的问题,但我的情况有点不同。就我而言,我从0WIDTH 开始,并等待onLayout 事件回调设置正确的宽度。因此,在初始渲染时,initialScrollIndex 的值无关紧要,它不能以零宽度滚动。使用Dimensions 设置初始宽度为我修复了它。

      【讨论】:

        【解决方案5】:

        我遇到了完全相同的问题,这就是我找到您的问题的原因。经过大量测试,我找到了一种解决方法,似乎可行。在呈现列表后,我没有使用initialScrollIndex,而是使用了函数scrollToIndex。将它应用到您的代码中,它看起来像

        import React, { Component } from 'react';
        import { FlatList, Dimensions, View, Text } from 'react-native';
        
        const WIDTH = Dimensions.get('window').width;
        const HEIGHT = Dimensions.get('window').height;
        
        export default class App extends Component {
        
          render() {
            const data = [{id: 0},{id: 1},{id: 2},{id: 3},{id: 4}];
        
             return (
              <View onLayout={() => this.onLayout()}>
                <FlatList
                  ref={el => this.list = el}
                  data={data}
                  renderItem={this.renderItem}
                  keyExtractor={item => item.id}
        
                  pagingEnabled={true}
                  horizontal={true}
                  showsHorizontalScrollIndicator={false}
        
                  getItemLayout={this.getItemLayout}
        
                  debug={true}
                />
              </View>
            )
          }
        
          onLayout() {
            this.list.scrollToIndex({index: 2})
          }
        
          renderItem = ({ item }) => {
            return (
              <View style={{flex: 1, backgroundColor: 'lightblue', width: WIDTH, height: HEIGHT, justifyContent: 'center', alignItems: 'center'}}>
                <Text style={{color: 'white', fontSize: 300, fontWeight: 'bold'}}>{item.id}</Text>
              </View>
            );
          };
        
          getItemLayout = (data, index) => (
            {length: WIDTH, offset: WIDTH * index, index}
          );
        }
        

        希望它对你有用。

        顺便说一句,将this.list.scrollToIndex({index: 2}) 放在componentDidMount 中,出于某种原因对我不起作用,这就是我改用onLayout 的原因

        【讨论】:

        • 奇怪的是,传入initialScrollIndexgetItemLayout还是会出问题。我很惊讶它没有得到更好的修复或记录!当我使用这两个道具渲染 FlatList 时,它可以正常渲染,但是当我向上或向下滚动时,项目不会渲染。
        • @Spliid 太棒了!为我工作
        • @KarlTaylor 2019,这仍然很痛苦
        • this.list.scrollToIndex is not a function
        猜你喜欢
        • 1970-01-01
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-02
        • 2018-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多