J'ai un RecyclerView avec son adaptateur et LayoutManager. L'adaptateur a environ 15 différents ViewHolders. L'un d'eux contient WebView qui charge des contenus externes (99% d'entre eux sont des vidéos en dehors de YouTube). Le problème survient lorsqu'une vue de l'adaptateur sort de l'écran - la vidéo dans WebView continue de jouer et le son est en cours de lecture. Pourtant, c'est acceptable pour moi.
Le problème clé commence lorsque je passe à une autre activité. Le son de la vidéo est toujours présent.
Existe-t-il un moyen pour RecyclerView de m'avertir lorsque l'une de ses vues enfants change d'état de visibilité (la signification disparaît de l'affichage)?
Je vais me répondre. La meilleure approche consiste à ajouter RecyclerView.OnChildAttachStateChangeListener
À ma RecyclerView, puis à gérer les événements avec ma WebView lorsque onChildViewDetachedFromWindow(View view)
est appelée.
Exemple:
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();
}
}
});
Une approche que vous pourriez utiliser est la suivante:
Vous pouvez utiliser les layoutManager.findFirstVisibleItemPosition();
et layoutManager.findLastVisibleItemPosition();
pour obtenir les première et dernière positions visibles à l'écran. Si votre article ne se situe pas entre ces valeurs, il est hors de l'écran.
Faites-moi savoir si c'est ce que vous recherchez, ou si vous avez besoin/souhaitez utiliser une autre approche pour une raison quelconque.
La façon la plus simple de le faire est probablement d'utiliser un RecyclerListener
- voir la documentation disponible: https://developer.Android.com/reference/Android/support/v7/widget/RecyclerView.RecyclerListener. html
Le rappel obtient onViewRecycled(RecyclerView.ViewHolder holder)
afin que vous puissiez facilement savoir quelles vues sont recyclées.