React native 如何确定scrollview(或listview)子项是否主要在React Native中的视图中

React native 如何确定scrollview(或listview)子项是否主要在React Native中的视图中,react-native,react-native-listview,react-native-scrollview,React Native,React Native Listview,React Native Scrollview,我目前正在使用ListView显示一些数据。由于设计原因,这些行占据了屏幕高度的70%,这意味着至少有2行可见,最多3行。我想确定的是哪一行最明显 我目前正在使用onChangeVisibleRows,但这只是告诉我哪些行是可见的,哪些行已经进入或离开视图 有什么想法吗?我没有足够的时间为你的问题设计一个精确的算法。但这是你能做的- 获取滚动位置。 获取屏幕高度。 计算ListView子级的大约高度 您可以利用这三件事来了解特定孩子占用了多少空间 通过获取滚动位置,您可以知道向下滚动了多少像

我目前正在使用ListView显示一些数据。由于设计原因,这些行占据了屏幕高度的70%,这意味着至少有2行可见,最多3行。我想确定的是哪一行最明显

我目前正在使用onChangeVisibleRows,但这只是告诉我哪些行是可见的,哪些行已经进入或离开视图


有什么想法吗?

我没有足够的时间为你的问题设计一个精确的算法。但这是你能做的-

  • 获取滚动位置。

  • 获取屏幕高度。

  • 计算ListView子级的大约高度

  • 您可以利用这三件事来了解特定孩子占用了多少空间

    通过获取滚动位置,您可以知道向下滚动了多少像素。将其除以孩子的身高,这样就可以得到用户滚动了多少个孩子

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

    最后,
    onChangeVisibleRows
    将告诉您哪些子项是可见的。祝你好运

    只有当您知道一次有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]
        }
    }
    

    需要注意的是,它没有完全映射到最可见的行被认为是可见的。然而,在使用它的时候,滚动是有意义的。在我的特定应用程序中,活动行和非活动行之间有一个可见的移动,因此它可以帮助用户了解发生了什么。

    感谢您的回复。事实上,为了避免使用onScroll,我用了另一种方法(见我的)。我发现像这样使用onScroll会降低性能,这取决于您触发onScroll事件的频率。@Mihir,是否还有计算每个子行/行的高度的方法?如果每个子行/行高度都是动态的,没有固定的大小,该怎么办?谢谢。这个解决方案不适用于Android,因为onChangeVisibleRows还没有在Android上实现。令人烦恼的是,它没有在回调中包含头,所以你不知道它是否在视图中。即使它像顶部的项目一样滚动