React Native 如何获取RN平面列表中当前可见的索引

bkhjykvo  于 2022-12-24  发布在  React
关注(0)|答案(7)|浏览(344)

我有一个水平平面列表,其中每个项目是width:300,我所要做的就是获取当前可见项目的索引。

<FlatList 
            onScroll={(e) => this.handleScroll(e)} 
            horizontal={true}
            data={this.state.data}
            renderItem...

尝试了以下操作:

handleScroll(event) {
    let index = Math.ceil(
      event.nativeEvent.contentOffset.x / 300
    );

像这样的:

handleScroll(event) {
  let contentOffset = event.nativeEvent.contentOffset;
  let index = Math.floor(contentOffset.x / 300);

但没有什么是准确的,我总是得到一个指数向上或一个指数向下。
我做错了什么,如何在平面列表中获得正确的当前索引?

  • 例如,我可以列出列表中的第8个项目,但我得到的索引为9或10。*

xpcnnkqh

xpcnnkqh1#

UPD.感谢@ch271828n指出不应更新onViewableItemsChanged

您可以使用FlatList onViewableItemsChanged prop来获得您想要的内容。

class Test extends React.Component {
  onViewableItemsChanged = ({ viewableItems, changed }) => {
    console.log("Visible items are", viewableItems);
    console.log("Changed in this iteration", changed);
  }

  render () => {
    return (
      <FlatList
        onViewableItemsChanged={this.onViewableItemsChanged }
        viewabilityConfig={{
          itemVisiblePercentThreshold: 50
        }}
      />
    )
  }
}

viewabilityConfig可以帮助您对可视性进行任何设置。在代码示例中,50表示如果项目的可见性超过50%,则认为该项目可见。
配置结构可在here中找到

ax6ht2ek

ax6ht2ek2#

与@fzyzcjy和@Roman的答案相关。在react 16.8+中,您可以使用useCallback来处理changing onViewableItemsChanged on the fly is not supported错误。

function MyComponent(props) {
        const _onViewableItemsChanged = useCallback(({ viewableItems, changed }) => {
            console.log("Visible items are", viewableItems);
            console.log("Changed in this iteration", changed);
        }, []);
    
        const _viewabilityConfig = {
            itemVisiblePercentThreshold: 50
        }
    
        return <FlatList
                onViewableItemsChanged={_onViewableItemsChanged}
                viewabilityConfig={_viewabilityConfig}
                {...props}
            />;
    }
qxgroojn

qxgroojn3#

非常感谢投票最多的答案:)然而,当我尝试它时,它不起作用,引发了一个错误,说changing onViewableItemsChanged on the fly is not supported。经过一些搜索,我找到了解决方案here。下面是可以运行而没有错误的完整代码。关键是,这两个配置应该作为类属性,而不是在render()函数中。

class MyComponent extends Component {  
  _onViewableItemsChanged = ({ viewableItems, changed }) => {
    console.log("Visible items are", viewableItems);
    console.log("Changed in this iteration", changed);
  };

  _viewabilityConfig = {
    itemVisiblePercentThreshold: 50
  };

  render() {
    return (
        <FlatList
          onViewableItemsChanged={this._onViewableItemsChanged}
          viewabilityConfig={this._viewabilityConfig}
          {...this.props}
        />
      </View>
    );
  }
}
kiayqfof

kiayqfof4#

this.handleScroll = (event) => {
  let yOffset = event.nativeEvent.contentOffset.y
  let contentHeight = event.nativeEvent.contentSize.height
  let value = yOffset / contentHeight
}

<FlatList onScroll={this.handleScroll} />

获取舍入值以计算页码/索引。

zaq34kh6

zaq34kh65#

我想,在您的情况下,您可能会忽略项的paddingmargincontentOffsetXcontentOffsetY应该是firstViewableItemIndex *(itemWidth + item padding or margin)。

作为其他答案,onViewableItemsChanged将是满足您需求的更好选择。我写了一篇关于如何使用它以及如何实现它的文章。https://suelan.github.io/2020/01/21/onViewableItemsChanged/

ejk8hzay

ejk8hzay6#

有点晚,但对我来说是不同的功能组件...
如果您使用的是功能组件,请执行以下操作:

const onScroll = useCallback((event: NativeSyntheticEvent<NativeScrollEvent>) => {
    const slideSize = event.nativeEvent.layoutMeasurement.width;
    const index = event.nativeEvent.contentOffset.x / slideSize;
    const roundIndex = Math.round(index);
    console.log("roundIndex:", roundIndex);
  }, []);

然后在平面列表上

<FlatList
      data={[2, 3]}
      horizontal={true}
      pagingEnabled={true}
      style={{ flex: 1 }}
      showsHorizontalScrollIndicator={false}
      renderItem={renderItem}
      onScroll={onScroll}
    />
wlsrxk51

wlsrxk517#

请使用基于类的组件。onViewableItemsChanged()方法仅适用于类,否则给予出错

相关问题