web-dev-qa-db-fra.com

RecyclerView - rappel lorsque la vue n'est plus visible

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

27
mroczis

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

            }
        }
    });
36
mroczis

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.

3
ryguy

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.

1
AllDayAmazing