我有一个水平平面列表,其中每个项目是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。*
7条答案
按热度按时间xpcnnkqh1#
UPD.感谢@ch271828n指出不应更新onViewableItemsChanged
您可以使用FlatList
onViewableItemsChanged
prop来获得您想要的内容。viewabilityConfig
可以帮助您对可视性进行任何设置。在代码示例中,50
表示如果项目的可见性超过50%,则认为该项目可见。配置结构可在here中找到
ax6ht2ek2#
与@fzyzcjy和@Roman的答案相关。在react 16.8+中,您可以使用
useCallback
来处理changing onViewableItemsChanged on the fly is not supported
错误。qxgroojn3#
非常感谢投票最多的答案:)然而,当我尝试它时,它不起作用,引发了一个错误,说
changing onViewableItemsChanged on the fly is not supported
。经过一些搜索,我找到了解决方案here。下面是可以运行而没有错误的完整代码。关键是,这两个配置应该作为类属性,而不是在render()函数中。kiayqfof4#
获取舍入值以计算页码/索引。
zaq34kh65#
我想,在您的情况下,您可能会忽略项的
padding
或margin
,contentOffsetX
或contentOffsetY
应该是firstViewableItemIndex
*(itemWidth
+item padding or margin
)。作为其他答案,
onViewableItemsChanged
将是满足您需求的更好选择。我写了一篇关于如何使用它以及如何实现它的文章。https://suelan.github.io/2020/01/21/onViewableItemsChanged/ejk8hzay6#
有点晚,但对我来说是不同的功能组件...
如果您使用的是功能组件,请执行以下操作:
然后在平面列表上
wlsrxk517#
请使用基于类的组件。onViewableItemsChanged()方法仅适用于类,否则给予出错