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

Posted

技术标签:

【中文标题】RecyclerView - 当视图不再可见时回调【英文标题】:RecyclerView - callback when view is no longer visible 【发布时间】:2015-10-19 10:50:44 【问题描述】:

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

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

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

【问题讨论】:

RecyclerView.RecyclerListener ?还是不直接由 RecyclerView.OnScrollListener ? 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

我会回应自己。最好的方法是将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();

            
        
    );

【讨论】:

此方法是否会导致 webview 在 webview 完全可见之前播放视频,因为将自身附加到 recyclerview 的视图与在 recyclerview 中完全可见的视图不同。 请注意:如果您在适配器内,则可以直接覆盖 onViewDetachedFromWindow()。这太棒了。 这太棒了。非常感谢! 如何获取从窗口附加/分离的项目的位置? 如果您执行上述 Plexus 的操作,您将拥有视图持有者,并且只需执行 holder.getAdapterPosition()【参考方案3】:

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

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

【讨论】:

onViewRecycled 的问题是回收视图中的项目在看不见时不一定被回收,很大程度上取决于您在回收视图中放置了多少缓存

以上是关于RecyclerView - 当视图不再可见时回调的主要内容,如果未能解决你的问题,请参考以下文章

检查 ARReferenceImage 在相机视图中是不是不再可见

在recyclerview中使用textureview播放视频

在 RecyclerView 中滚动时不可见的项目变得可见

当在nestedscrollview的recyclerview中将项目拖出可见空间时-nestedscrollView不滚动

RecyclerView 中的多个视图

从 iphone 上的 push segue 导航返回时,顶部导航栏变得可见