小编DeN*_*eNG的帖子

React Native - 如何在水平可滚动列表中模拟 RefreshControl

问题

我正在开发一个水平可滚动列表,每次滑动时它总是滚动整个屏幕(即一个“页面”)。当它位于第一页并且用户再次向右拉动时,我需要刷新整个列表

对于垂直视图,如果用户在视图位于最顶部位置时向下拉,则会出现ScrollView标准。RefreshControl但对于横版来说,并没有标准的解决方案。

我的实验

这个想法

我尝试添加一个PanResponder来捕捉感人和感动的事件。请注意,我VirtualizedList在我的应用程序中使用了 a 。基本逻辑是:

  • 我创建一个隐藏的View(其宽度默认设置为 0)ActivityIndicator,其中包含一个,并将此视图作为 插入ListHeaderComponentVirtualizedList
  • 我监听 的VirtualizedList事件onScroll并不断保存最新的滚动位置
  • 当滚动位置接近 0 并且用户向右拉动(通过事件捕获手势PanResponder)时,我使用 ActivityIndi​​cator 对隐藏视图的宽度进行动画处理以模拟 RefreshControl 行为

结果

但是,PanResponder无法正确捕获所需的事件。大多数时候,当我在开始处向右拉动时VirtualizedList(在 Android 设备上),只会出现标准的击中边缘动画(出现渐变蓝色层)。

通过添加一些日志,我发现onPanResponderGrant偶尔会触发,但onPanResponderMoveonPanResponderReleaseonPanResponderTerminate或 都onPanResponderTerminationRequest不会被触发。

触发时onPanResponderGrant,隐藏ActivityIndicator偶尔会部分出现。“向右拉”效果只会很快出现,并且总是立即停止,只出现隐藏视图的非常狭窄的部分。

我猜底层ScrollView窃取了事件并阻止我的代码响应。但即使我设置onPanResponderTerminationRequest总是返回false仍然无济于事。即使我直接用VirtualizedList …

horizontalscrollview react-native react-native-scrollview

5
推荐指数
1
解决办法
2386
查看次数