Я пытаюсь реализовать бесконечный прокрутки ListView в React Native. Это работает, обнаруживая, когда listview достигает нижней части его длины содержимого и запускает другой API. Когда получен ответ, новые данные добавляются к исходным данным (это делается в моем хранилище Flux). Однако в моем компоненте, я обновляю DataSource через:React Native - Infinite Scroll ListView
setState({
dataSource: this.state.dataSource.cloneWithRows(Store.getLatestData())
})
Проблему я, кажется, имея это каждый раз, когда это происходит, то ListView обновляется и теряет свои позиции прокрутки (она возвращается к началу). Как я могу добавить новые данные, не потеряв текущую позицию?
Спасибо!
UPDATE
Я пытаюсь сохранить свиток смещения, прежде чем добавить новые данные затем прокрутите список до начала смещения после добавления данных. Я пытаюсь сделать это:
this._listView.getScrollResponder().scrollTo(offset, 0);
где this._listView является рефами компоненты ListView. Тем не менее, this._listView всегда кажется нулевым, когда я обращаюсь к нему. Мое предположение заключается в том, что ссылка на listview равна нулю в течение секунды секунды во время рендеринга?
UPDATE 2
Для получения дополнительной информации:
Мой getInitialState является:
getInitialState: function() {
var ds = new ListView.DataSource({
rowHasChanged: (r1, r2) => r1 !== r2,
sectionHeaderHasChanged: (s1, s2) => true
});
return {
dataSource: ds.cloneWithRows(LeaderboardsStore.getLeaderboard()),
//some other state too
}
После того, как я обнаружил пользователь прокрутил вниз, я отправился вызов API с помощью API-интерфейс Fetch, который возвращает новые данные и добавляется к исходному массиву через concat. Хранилище, в котором хранится массив (хранилище потоков), выдает событие изменения.
В моем onStoreChange обратного вызова я переназначить DataSource следующим образом:
setState({
dataSource: this.state.dataSource.cloneWithRows(Store.getLatestData())
})
который обновляет мой ListView, как и ожидался (с нежелательным изменением положения прокрутки).
Мой метод визуализации выглядит (для простоты):
render:function() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow}
ref={(component) => {this._listView = component;}}
/>
);
}
Я попытался изменить свой onStoreChange обратный вызов:
onStoreChangeCallback: function() {
this._scrollOffset = this._listView.scrollProperties.offset;
this.setState({
dataSource: this.state.dataSource.cloneWithRows(Store.getLatestData())
}, function() {
if (this._scrollOffset !== undefined) {
this._listView.getScrollResponder().scroll(offset, 0);
}
});
}
однако, this._listView кажется утратившими на getScrollResponder линии: (
Спасибо, что ответили. Извините, я должен был прояснить это раньше. Я добавляю новые данные с помощью concat, и я вижу, что он работает, так как я вижу новые дополнительные результаты в списке. Проблема в том, что каждый раз, когда я просматриваю нижнюю часть и добавляю новые данные, список снова обновляется до верхней части экрана. Я бы хотел, чтобы он оставался с тем же самым смещением, что и до добавления новых данных. – coldbuffet
Я понимаю. Можете ли вы поделиться каким-то кодом? – eyal83
Я обновил OP для получения дополнительной информации – coldbuffet