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)?
La forma más sencilla de hacerlo es probablemente utilizando un RecyclerListener
; consulte la documentación disponible: https://developer.android.com/reference/android/support/v7/widget/RecyclerView.RecyclerListener.html
La devolución de llamada obtiene onViewRecycled(RecyclerView.ViewHolder holder)
para que pueda saber fácilmente qué vistas se reciclan.
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();
}
}
});