Как определить, просматривается ли дочерний элемент scrollview (или listview) в основном в React Native

В настоящее время я использую ListView для отображения некоторых данных. Из-за дизайна строки занимают около 70% высоты экрана, что означает, что всегда видны как минимум 2 строки, максимум три. Я хотел бы определить, какая строка в основном видна.

В настоящее время я использую onChangeVisibleRows, но это просто говорит мне, какие строки видны или вошли или вышли из представления.

Любые идеи?


person doostin    schedule 29.03.2016    source источник


Ответы (2)


Это будет работать только тогда, когда вы знаете, что одновременно видны 2-3 (не больше и не меньше) строк:

onChangeVisibleRows={(visibleRows) => {
    const visibleRowNumbers = Object.keys(visibleRows.s1).map((row) => parseInt(row));
    if (visibleRowNumbers.length === 2) {
        // visible row is visibleRowNumbers[0]
    }
    if (visibleRowNumbers.length === 3) {
        // visible row is visibleRowNumbers[1]
    }
}

Предостережение в том, что он не идеально сопоставляется с наиболее заметной строкой, которая считается видимой. Тем не менее, его использование имеет смысл при прокрутке. В моем конкретном приложении наблюдается видимый сдвиг между активными и неактивными строками, что помогает пользователю понять, что произошло.

person doostin    schedule 01.04.2016
comment
это решение не будет работать для Android, так как onChangeVisibleRows еще не реализован для Android. - person Brackets; 12.04.2017
comment
Досадно, что он не включает заголовок в обратный вызов, поэтому вы не знаете, видно это или нет. Несмотря на то, что он прокручивается так же, как элемент вверху - person conor909; 16.01.2018

У меня нет достаточно времени, чтобы разработать точный алгоритм для вашей проблемы. Но вот что вы можете сделать-

  1. Получить положение прокрутки. React native: получить текущую позицию прокрутки прокрутки

  2. Получить высоту экрана. https://facebook.github.io/react-native/docs/dimensions.html#content

  3. Рассчитать ок. высота дочернего элемента ListView.

Вы можете использовать эти три вещи, чтобы узнать, сколько места было занято конкретным дочерним элементом.

Получив положение прокрутки, вы можете узнать, на сколько пикселей вы прокрутили вниз. Разделите это на рост вашего ребенка, чтобы вы могли получить, сколько детей было прокручено пользователем.

(Scrolled height / Child height) = No. of children scrolled. 

И, наконец, onChangeVisibleRows сообщит вам, какие дочерние элементы видны. Удачи!

person Mihir    schedule 30.03.2016
comment
Спасибо за ответ. На самом деле я пошел по другому пути (см. мой ответ), чтобы избежать использования onScroll. Я обнаружил, что onScroll для подобных применений может снизить производительность в зависимости от того, как часто вам приходится запускать событие onScroll. - person doostin; 01.04.2016
comment
@Mihir, можно ли как-то вычислить высоту каждого дочернего элемента/строки? что, если высота каждого дочернего элемента/строки является динамической, без фиксированного размера? Спасибо. - person WantIt; 07.07.2017