Что onEndReachedThreshold действительно означает в

из документации:

onEndReachedThreshold number

Порог в пикселях (виртуальный, а не физический) для вызова onEndReached.  поэтому я просто хотел знать, что это значит, это порог сверху, или это порог снизу.

Сверху? - если я устанавливаю значение onEndReachedThreshold = {10}, мой вызов onEndReached вызывается, как только прокручивается до 10 пикселей или что-то еще.

Со дна? - если я установил значение onEndReachedThreshold = {listview height -10}, будет вызван мой onEndReached, как только я прокручу до 10 пикселей или что-то еще.

Ответ 1

документация - это всегда лучший способ:

Функция onEndReached
Вызывается, когда все строки были отрисованы, а список прокручен в пределах onEndReachedThreshold в нижней части. Предусмотрено собственное событие прокрутки.

onEndReachedThreshold number
Threshold in pixels (virtual, not physical) for calling onEndReached.

Итак, как я это вижу: если вы делаете onEndReachedThreshold ={10}, он вызывает onEndReached, если вы прокручивали до 10 пикселей снизу

Ответ 2

Для тех, кто использует FlatList INSTEAD ListView, обратите внимание, что единицы измерения параметров изменены.

Для ListView он находился в пикселях снизу, но согласно docs для FlatList, вместо этого единицы длины снизу в элементах списка.

Как далеко от конца (в единицах видимой длины списка) нижний край списка должен быть от конца содержимого, чтобы вызвать обратный вызов onEndReached. Таким образом, значение 0.5 будет вызывать onEndReached, когда конец содержимого находится в пределах половины видимой длины списка.

Таким образом, если вы хотите, чтобы список обновлялся, когда пользователь находится на полпути вниз к текущему набору данных, установите значение 0.5

Ответ 3

Я думаю, что проблема возникла из-за многих просмотров и прокруток, поэтому я использовал в качестве компонента warper для Listview, у него была такая же проблема, я просто изменяю его на View со стилем: {flex: 1}, и он работает штраф

return (
    <View style={{flex: 1}}>
      <ListView
        dataSource={this.dataSource}
        renderRow={this._renderRow.bind(this)}
        onEndReached={this._paginateDataSource.bind(this)}
        style={styles.listView}/>
      {loading}
    </View>  
  )

Ответ 4

Вот как это работает в зависимости от исходного кода:

const {contentLength, visibleLength, offset} = this._scrollMetrics;
const distanceFromEnd = contentLength - visibleLength - offset;
if (
  onEndReached &&
  this.state.last === getItemCount(data) - 1 &&
  distanceFromEnd < onEndReachedThreshold * visibleLength &&
  (this._hasDataChangedSinceEndReached ||
    this._scrollMetrics.contentLength !== this._sentEndForContentLength)
) {
  // Only call onEndReached once for a given dataset + content length.
  this._hasDataChangedSinceEndReached = false;
  this._sentEndForContentLength = this._scrollMetrics.contentLength;
  onEndReached({distanceFromEnd});
}

Итак, в первую очередь, он выполняет проверку обратного вызова onEndReached, если он существует, после чего он проверяет, отображается ли последний элемент данных (не обязательно видимый), и только тогда он проверяет, достаточно ли прокручивается до нижней части списка.

visibleLength - высота элемента списка (если горизонтальный не установлен), а contentLength - высота вашего контейнера элемента списка, умножающего количество элементов в данных. Как вы видите, onEndReachedThreshold возвращает число "видимых экранов" (то есть высоты элемента списка), вы должны прокручивать до тех пор, пока ваш обратный вызов onEndReached не загорится - больше onEndReachedThreshold, меньше вас должен прокручиваться. При значении onEndReachedThreshold = 0.5 ваш обратный вызов будет срабатывать почти в "конце" списка. Но помните, что не будет срабатывать до тех пор, пока последний элемент не будет отображаться, независимо от того, какое значение вы установите.