14

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

https://snack.expo.io/Bk1mkK0zZ

4

5 回答 5

18

我有完全相同的问题,这就是我找到你的问题的原因。经过大量测试,我找到了一种解决方法,似乎可行。在呈现列表后,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改用的原因

于 2017-06-14T20:13:11.810 回答
6

使用 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>
        );
    }}
/>
于 2020-01-11T09:30:18.470 回答
2

我使用了 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}/>
于 2021-01-13T08:06:26.170 回答
0

只需删除以下内容:

pagingEnabled = { true }

这将解决您的示例。

于 2020-05-29T15:10:32.943 回答
0

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

于 2017-12-28T22:33:55.470 回答