Вы можете slice
данные, предоставляемые в FlatList
каждый раз, когда нажимается кнопка. Поскольку FlatList является чистым компонентом, вам нужно пропустить extra
реквизит для повторного рендеринга FlatList после нажатия кнопки * 1004. *
Ведение переменной состояния, такой как section, которая описывает, какая часть данных должна отображаться, например (0,15), (15,30), ...
Обновите эту переменную с помощью кнопок вверх и вниз, заботясь о границах, чтобы не получить плохих результатов. Это легко решить, поместив setState
в условие if, чтобы оно выглядело примерно как
updateSectionLow = () => {
const { section } = this.state;
if (section > 0) {
this.setState({
section: section - 1,
});
}
};
updateSectionHigh = () => {
const { section, data } = this.state;
if (data.length > (section + 1) * 15) {
this.setState({
section: section + 1,
});
}
};
, а FlatList выглядит следующим образом
<FlatList
data={this.state.data.slice(this.state.section*15,(this.state.section+1)*15)}
renderItem={({ item }) => {
return (
<View style={styles.row}>
<Text>{item.data}</Text>
</View>
);
}}
extraData={this.state.section}
/>
Вот рабочая выставка демо
РЕДАКТИРОВАТЬ После обсуждения с сотрудником OP я немного изменил свой код.
Получить смещение после прокрутки для вертикального списка
onMomentumScrollEnd={e => this.scroll(e.nativeEvent.contentOffset)}
Внутри обработчика
this.setState({
index: Math.floor(offset.y / (ITEM_HEIGHT+SEPARATOR_HEIGHT)),
});
если разделителя нет, вы можете поставить SEPARATOR_HEIGHT
равным 0
и это только вопрос использования scrollToOffset с ref какследует
для перехода по списку с помощью ITEMS_DISP (например, 15)
this.flatListRef.scrollToOffset({
offset:(this.state.index+ITEMS_DISP)*ITEM_HEIGHT+(this.state.index+ITEMS_DISP)*SEPARATOR_HEIGHT
});
для перехода по списку по некоторому ITEMS_DISP
this.flatListRef.scrollToOffset({
offset:(this.state.index-ITEMS_DISP)*ITEM_HEIGHT+(this.state.index-ITEMS_DISP)*SEPARATOR_HEIGHT
});
Обновленная демонстрационная ссылка