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

Android RecyclerView-视图不再可见时回调,android,listener,android-recyclerview,android-viewholder,Android,Listener,Android Recyclerview,Android Viewholder,我有一个带有适配器和LayoutManager的RecyclerView。适配器有大约15个不同的视窗夹。其中一个包含加载外部内容的WebView(其中99%是YouTube之外的视频)。 当适配器的任何视图离开屏幕时,问题就出现了——WebView中的视频一直在播放,声音也在播放。不过,这对我来说还是可以接受的 当我转到另一项活动时,关键问题就开始了。视频的声音仍然存在 当RecyclerView的任何子视图更改可见性状态(即从显示中消失)时,是否有任何方法可以通知我?您可以使用以下方法: 您

我有一个带有适配器和LayoutManager的RecyclerView。适配器有大约15个不同的视窗夹。其中一个包含加载外部内容的WebView(其中99%是YouTube之外的视频)。 当适配器的任何视图离开屏幕时,问题就出现了——WebView中的视频一直在播放,声音也在播放。不过,这对我来说还是可以接受的

当我转到另一项活动时,关键问题就开始了。视频的声音仍然存在


当RecyclerView的任何子视图更改可见性状态(即从显示中消失)时,是否有任何方法可以通知我?

您可以使用以下方法:

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


让我知道这是否是你想要的,或者你是否出于某种原因需要/想要使用另一种方法。

我会回应我自己。最好的方法是将
RecyclerView.OnChildAttachStateChangeListener
添加到我的RecyclerView,然后在调用
onChildViewDetachedFromWindow(视图视图)
时使用我的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
-请参阅可用文档:


回调在ViewRecycled(RecyclerView.ViewHolder)上获得
,因此您可以轻松地判断哪些视图被回收。

RecyclerView.RecyclerListener?或者不直接通过RecyclerView.OnScrollListener?此方法是否会导致webview在webview完全可见之前播放视频,因为附加到RecyclerView的视图与在RecyclerView中完全可见的视图不同。请注意:如果您在适配器内,则可以覆盖onViewDetachedFromWindow()直接的。太棒了,太棒了。非常感谢!如何获取从窗口附加/分离的项目的位置?如果您执行上面提到的Plexus操作,您将拥有视图保持架,并且可以只执行保持架操作。getAdapterPosition()onViewRecycled的问题是,回收视图中的项目在看不见时不一定回收,这在很大程度上取决于您在回收视图上放置了多少缓存