这是您想要实现的工作演示:https ://sketch.expo.io/BkreW1che 。您可以单击“预览”在浏览器中查看。
这是测量 ListView 的高度并将指示器放在其顶部所需的主要代码(请访问上面的链接以查看完整源代码):
handleLayout(event) {
const { y, height } = event.nativeEvent.layout;
// Now we know how tall the ListView is; let's put the indicator in the middle.
this.setState({ indicatorOffset: y + (height / 2) });
}
renderIndicator() {
const { indicatorOffset } = this.state;
// Once we know how tall the ListView is, put the indicator on top.
return indicatorOffset ? (
<View style={[{ position: 'absolute', left: 0, right: 0, top: indicatorOffset }]} />
) : null;
}
render() {
return (
<View style={styles.container}>
<ListView
onLayout={(event) => this.handleLayout(event)}
dataSource={this.state.dataSource}
renderRow={this.renderRow}
/>
{this.renderIndicator()}
</View>
);
}
编辑:我现在了解到您希望指示器与列表一起滚动。这是上面的一个简单更改,只需onScroll
在 ListView 中添加一个侦听器:https ://sketch.expo.io/HkEjDy92e
handleScroll(event) {
const { y } = event.nativeEvent.contentOffset;
// Keep the indicator at the same position in the list using this offset.
this.setState({ scrollOffset: y });
},
onScroll
有了这个变化,由于回调的延迟,指标实际上似乎有点滞后。
如果您想要更好的性能,您可以考虑将指标渲染为您renderRow
方法的一部分。例如,如果您知道指标应该在上午 10:30 出现,那么您将在上午 10:00 行的中间呈现它。