Как проверить, какой элемент отображается на экране recyclerview - PullRequest
0 голосов
/ 10 июля 2020

Я хочу узнать видимый элемент на экране, чтобы, если экзоплеер этого элемента запущен, я мог его остановить. Здесь я пробовал много способов остановить уже запущенный 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)
                    }}

            }
        }
    })

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Используя RecyclerView LayoutManager, вы можете найти firstVisibleItemPosition & firstCompletelyVisibleItemPosition и аналогично последние.

Когда элемент начинает воспроизведение видео (при условии, что вы написали реализацию в ViewHolder class), вы можете найти позицию игрового элемента по getAdapterPosition там. Используйте глобальную переменную для поддержания этой currentlyPlaying позиции элемента (возможно, в вашем классе фрагмента / активности, откуда вы устанавливаете адаптер), вы можете отправить позицию для просмотра класса через интерфейсный слушатель.

Теперь всякий раз, когда прокручивая, вы можете проверить, находится ли позиция текущего воспроизводимого элемента в диапазоне видимых элементов. Если да, вы можете позвонить по номеру adapter.notifyItemChanged(currentlyPlaying, true), чтобы приостановить / остановить проигрыватель. true - это настраиваемое логическое значение, которое вы можете отправить на свой адаптер, которое может быть перехвачено внутри OnBindViewHolder с аргументом payloads, чтобы переключить состояние воспроизведения видео.

0 голосов
/ 10 июля 2020

ваш for l oop должен выглядеть так

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

приостановить все невидимые элементы - положение ниже первого видимого или выше последнего видимого - при условии, что вы собрали все ExoPlayer s в tipList правильно

код приостановки игроков должен срабатывать только при изменении состояния на AbsListView.OnScrollListener.SCROLL_STATE_IDLE (список перестает прокручиваться, касанием или бросанием), поэтому приведенный выше должен быть заключен в некоторый оператор if

дополнительно вы можете приостановить проигрыватель внутри адаптера в onViewDetachedFromWindow или onViewRecycled method

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...