studio recyclerview onitemtouchlistener item example android listener android-recyclerview android-viewholder

android - onitemtouchlistener - RecyclerView-devolución de llamada cuando la vista ya no es visible



recyclerview onitemclicklistener example in android (3)

Tengo un RecyclerView con su adaptador y LayoutManager. El adaptador tiene aproximadamente 15 ViewHolders diferentes. Uno de ellos contiene WebView que carga contenidos externos (el 99% de ellos son videos fuera de YouTube). El problema surge cuando cualquier Vista del Adaptador sale de la pantalla: el video en WebView continúa reproduciéndose y el sonido se reproduce. Aún así, eso es aceptable para mí.

El problema clave comienza cuando me muevo a otra actividad. El sonido del video sigue presente.

¿Hay alguna forma en que RecyclerView pueda notificarme cuando alguna de sus vistas secundarias cambie el estado de visibilidad (lo que significa que desaparece de la pantalla)?



Un enfoque que puede utilizar es el siguiente:

Puede utilizar el layoutManager.findFirstVisibleItemPosition(); y layoutManager.findLastVisibleItemPosition(); para obtener las primeras y últimas posiciones que son visibles en la pantalla. Si su artículo no se encuentra entre estos valores, entonces está fuera de la pantalla.

Déjeme saber si esto es lo que está buscando, o si necesita / quiere usar otro enfoque por alguna razón.


Voy a responder a mí mismo. El mejor enfoque es agregar RecyclerView.OnChildAttachStateChangeListener a mi RecyclerView y luego manejar los eventos con mi WebView cuando se onChildViewDetachedFromWindow(View view) .

Ejemplo:

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