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播放视频
当在nestedscrollview的recyclerview中将项目拖出可见空间时-nestedscrollView不滚动