0

我想知道屏幕上的可见项目,以便如果该项目的 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)
                    }}

            }
        }
    })
4

2 回答 2

0

你的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)
    }
}

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

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

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

于 2020-07-10T05:34:53.193 回答
0

使用RecyclerView LayoutManager,您可以找到firstVisibleItemPosition&firstCompletelyVisibleItemPosition和类似的最后一个。

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

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

于 2020-07-10T07:23:13.020 回答