RecyclerView - обратный вызов, когда вид больше не отображается

У меня есть RecyclerView с его адаптером и LayoutManager. Адаптер имеет приблизительно 15 различных ViewHolders. Один из них содержит WebView, который загружает внешнее содержимое (99% из них - видео за пределами YouTube). Проблема возникает, когда какой-либо вид адаптера выходит из экрана - видео в WebView продолжает играть и воспроизводится звук. Тем не менее, это приемлемо для меня.

Ключевая проблема начинается, когда я перехожу к другому Activity. Звук видео по-прежнему присутствует.

Можно ли каким-либо образом RecyclerView уведомить меня, когда какой-либо из его дочерних представлений изменит состояние видимости (значение исчезает с дисплея)?

Ответ 1

Собираюсь ответить самому себе. Лучший подход - добавить RecyclerView.OnChildAttachStateChangeListener в мой RecyclerView, а затем обработать события с помощью моего WebView при вызове onChildViewDetachedFromWindow(View view).

Пример:

mRecyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
        @Override
        public void onChildViewAttachedToWindow(View view) {
            WebView webView = (WebView) view.findViewById(R.id.webview);
            if (webView != null) {
                webView.onResume();
            }
        }

        @Override
        public void onChildViewDetachedFromWindow(View view) {
            WebView webView = (WebView) view.findViewById(R.id.webview);

            if (webView != null) {
                webView.onPause();

            }
        }
    });

Ответ 2

Один из подходов, который вы можете использовать, следующий:

Вы можете использовать layoutManager.findFirstVisibleItemPosition(); и layoutManager.findLastVisibleItemPosition();, чтобы получить первую и последнюю позиции, которые видны на экране. Если ваш элемент не падает между этими значениями, то он отключен от экрана.

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