我的列表适配器创建一些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);