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

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

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

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

【问题讨论】:

  • RecyclerView.RecyclerListener ?还是不直接由 RecyclerView.OnScrollListener ?

标签: android listener android-recyclerview android-viewholder


【解决方案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 的问题是回收视图中的项目在看不见时不一定被回收,很大程度上取决于您在回收视图中放置了多少缓存
    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多