我的列表适配器创建一些Views(普通视图和头视图)使用持续运行的计时器循环显示图像。
我想知道什么是释放这些计时器和其他视图相关资源的适当方法,我的意思是,最好的做法是知道一个项目View(由Adapter.getView创建)不再可见/不需要,或者已经被回收或取消附加,甚至他们的父小部件都没有使用。
理想情况下,我在View本身中寻找方法/事件/监听器,而不是必须委托事件的父小部件。我想知道
View被提供给回收者时(即-它在一次投掷中退出屏幕等)
View可以被销毁时(即包含的小部件已被销毁)
到目前为止,我认为我还没有找到合适的、防失败的事件(如果有的话)。
我试过View.onAttachedToWindow()/View.onDetachedFromWindow()但是,与onAttachedToWindow相反,它似乎总是被正确地称为,onDetachedFromWindow不是。它似乎只在回收视图即将被重用时才被调用,但在其他情况下,如View进入回收池(退出屏幕)、小部件被销毁或活动完成时,则不会调用。
有什么建议吗?
编辑:
我做了一些测试,发现父窗口小部件上的onDetachedFromWindow是可靠的。目前,我的解决方案是将该事件传播到适配器,适配器会在屏幕上找到视图(getFirstVisiblePosition..),并使用下面的代码手动触发一个onDetachedFromWindow,但是,您知道,这非常难看。我相信有更好的办法。

// ugly function to trigger an onDetachedFromWindow to any view
// leeched from com.tonicartos.widget.stickygridheaders.StickyGridHeadersGridView
public static void detachHeader(View header) {
    if (header == null) { return; }

    try {
        Method method = View.class.getDeclaredMethod("dispatchDetachedFromWindow");
        method.setAccessible(true);
        method.invoke(header);
    } catch (NoSuchMethodException e) {
        throw new RuntimePlatformSupportException(e);
    } catch (IllegalArgumentException e) {
        throw new RuntimePlatformSupportException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimePlatformSupportException(e);
    } catch (InvocationTargetException e) {
        throw new RuntimePlatformSupportException(e);
    }
}

最佳答案

Adapter有一个方法在视图被回收时通知您。看一看
公共void onviewRecycled(recyclerView.viewHolder);

07-25 22:07