RecyclerView - 当视图不再可见时回调

RecyclerView - callback when view is no longer visible

我有一个带有 Adapter 和 LayoutManager 的 RecyclerView。 Adapter 有大约 15 个不同的 ViewHolder。其中之一包含加载外部内容的 WebView(其中 99% 是 YouTube 以外的视频)。 当 Adapter 的任何 View 离开屏幕时就会出现问题 - WebView 中的视频继续播放并且声音正在播放。不过,这对我来说是可以接受的。

当我搬到另一个Activity时,关键问题就开始了。视频的声音还在。

当 RecyclerView 的任何子视图更改可见性状态(意味着从显示中消失)时,有什么方法可以通知我吗?

您可以使用以下一种方法:

您可以使用 layoutManager.findFirstVisibleItemPosition();layoutManager.findLastVisibleItemPosition(); 获取屏幕上可见的第一个和最后一个位置。如果您的项目不在这些值之间,则它不在屏幕上。

让我知道这是否是您正在寻找的,或者您是否need/want出于某种原因使用其他方法。

我要回复我自己。最好的方法是将 RecyclerView.OnChildAttachStateChangeListener 添加到我的 RecyclerView,然后在调用 onChildViewDetachedFromWindow(View view) 时使用我的 WebView 处理事件。

示例:

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

            }
        }
    });

最简单的方法可能是使用 RecyclerListener - 请参阅可用文档:https://developer.android.com/reference/android/support/v7/widget/RecyclerView.RecyclerListener.html

回调得到 onViewRecycled(RecyclerView.ViewHolder holder),因此您可以轻松判断回收了哪些视图。