【问题标题】:How to check which item is visible on screen of recyclerview如何检查在recyclerview的屏幕上可见的项目
【发布时间】:2020-10-30 19:35:24
【问题描述】:

我想知道屏幕上的可见项目,以便如果该项目的 exoplayer 正在运行,我可以停止它。在这里,我尝试了很多方法来停止已经运行的 exoplayer,但我没有找到任何合适的解决方案。谁能告诉我如何实现这一目标。

使用所有这四种方法并没有给我可见的 recyclerview 项目。顾名思义,它只给了我屏幕上可见的最后一项和第一项

   rvTips.addOnScrollListener(object : RecyclerView.OnScrollListener() {
         override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            if (dy > 0) {
                // Scrolling up
            } else {
                // Scrolling down

            }
        }

        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
            super.onScrollStateChanged(recyclerView, newState)
           // First Method Tried
            firstVisiblePosition = layoutManager.findFirstVisibleItemPosition()
            lastVisiblePosition = layoutManager.findLastVisibleItemPosition()
            firstCompletelyVisiblePosition = layoutManager.findFirstCompletelyVisibleItemPosition()
            lastCompletelyVisiblePosition = layoutManager.findLastCompletelyVisibleItemPosition()
          
            for (i in 0 until tipList.size) {
                if (i != firstVisiblePosition
                    && i != lastVisiblePosition
                    && i != firstCompletelyVisiblePosition
                    && i != lastCompletelyVisiblePosition
                    && tipList[i].exoplayer != null
                ) {
                  
                    tipList[i].exoplayer!!.playWhenReady = false
                    tipList[i].exoplayer!!.stop()
                    tipList[i].exoplayer!!.seekTo(0)
                }}

           
            if (newState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {

            }

            // Second Method Tried
           if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                firstVisiblePosition = layoutManager.findFirstVisibleItemPosition()
                lastVisiblePosition = layoutManager.findLastVisibleItemPosition()
                firstCompletelyVisiblePosition = layoutManager.findFirstCompletelyVisibleItemPosition()
                lastCompletelyVisiblePosition = layoutManager.findLastCompletelyVisibleItemPosition()

                for (i in 0 until tipList.size) {
                    if ((i < firstVisiblePosition || i > lastVisiblePosition)
                        && tipList[i].exoplayer != null
                    ) {
                        tipList[i].exoplayer!!.playWhenReady = false
                        tipList[i].exoplayer!!.stop()
                        tipList[i].exoplayer!!.seekTo(0)
                    }}

            }
        }
    })

【问题讨论】:

标签: android kotlin android-recyclerview exoplayer


【解决方案1】:

使用RecyclerView LayoutManager,您可以找到firstVisibleItemPositionfirstCompletelyVisibleItemPosition 以及类似的最后一个。

当一个项目开始播放视频时(假设您已经在ViewHolder 类中编写了实现),您可以在其中通过getAdapterPosition 找到播放项目的位置。使用全局变量来维护此currentlyPlaying 项目位置(可能在您设置适配器的片段/活动类中),您可以通过接口侦听器将位置发送到视图类。

现在,当您滚动时,您可以检查当前播放项目的位置是否在可见项目范围内。如果是,您可以拨打adapter.notifyItemChanged(currentlyPlaying, true) 暂停/停止播放器。 true 是自定义布尔值,您可以发送到适配器,可以在 OnBindViewHolder 中使用 payloads 参数截取该值,以切换视频的播放状态。

【讨论】:

    【解决方案2】:

    你的for 循环应该是这样的

    for (i in 0 until tipList.size) {
        if ((i < firstVisiblePosition || i > lastVisiblePosition) &&
                tipList[i].exoplayer != null) {
                    tipList[i].exoplayer!!.playWhenReady = false
                    tipList[i].exoplayer!!.stop()
                    tipList[i].exoplayer!!.seekTo(0)
        }
    }
    

    暂停所有不可见项目 - 位置低于第一个可见或高于最后一个可见 - 假设您已正确收集 tipList 中的所有 ExoPlayers

    玩家暂停代码只有在状态更改为 AbsListView.OnScrollListener.SCROLL_STATE_IDLE 时才会触发(列表停止滚动,通过触摸或弹跳),所以上面应该包含在一些 if 语句中

    此外,您可以在 onViewDetachedFromWindowonViewRecycled 方法中暂停适配器内的播放器

    【讨论】:

    • 看第二种方法试过了。它对我不起作用。
    • 显示你准备得如何tipList,你确定tipList[i].exoplayer 是在i 位置连接到View 的同一个玩家吗?显示来自适配器的一些代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多