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

时间:2015-07-28 17:58:27

标签: android listener android-recyclerview android-viewholder

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

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

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

3 个答案:

答案 0 :(得分:35)

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

            }
        }
    });

答案 1 :(得分:3)

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

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

如果您正在寻找,或者您出于某种原因需要/想要使用其他方法,请告诉我。

答案 2 :(得分:1)

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

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