适配器上的检测项目视图已被破坏
我有一个带有BaseAdapter的ListView。我想更新列表中的一些项目而不刷新内容。为了实现这一点,我使用观察者模式。我有一个Observable对象,列表中的每个项目都是观察者。适配器上的检测项目视图已被破坏
public View getView(final int position, View convertView, final ViewGroup parent) {
final ItemViewHolder holder;
final Item item = (Item) getItem(position);
if (convertView == null) {
convertView = inflater.inflate(R.layout.item, parent, false);
/* ADD VIEWS TO HOLDER */
holder = new ItemViewHolder();
convertView.setTag(holder);
ItemObserver observer = new ItemObserver(holder, context);
mapObservers.put(holder, observer);
observable.addObserver(observer);
} else {
holder = (ItemViewHolder) convertView.getTag();
}
//Set values into view etc...
return convertView;
}
这很好,但问题是:我怎么知道观察员不再需要?我想要检测给定视图何时被销毁,以便从Map中获取观察者并将其从Observable对象中删除。视图被销毁时是否有任何监听器被调用?
我试过AbsListView.RecyclerListener.onMovedToScrapHeap(View view)
但它似乎在视图回收时调用。
谢谢!
你的项目视图必须扩展Android设备上查看和覆盖下一个方法:
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
// View is now detached, and about to be destroyed.
// Remove observer here.
}
编辑
阅读评论之后,我决定解释一下如何列表视图的作品。
最大的问题是视图正在被适配器重用。当您向下滚动列表时,最上面的项目视图会被重用(不会被销毁!)以显示最下面的项目视图。
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
...
return view;
}
它的背后是什么:
if (convertView == null) {
view = mInflater.inflate(resource, parent, false);
} else {
view = convertView;
}
因此,convertView是永远不会被破坏,但重用如果重写适配器的getView()方法,这反映在下一方法。再回到这个问题,你刚才应该根据变量位置更新支持器值,行之后:
holder = (ItemViewHolder) convertView.getTag();
// Update your holder/observer here. Something like:
holder.setPosition(position);
据this offical issue,有一个与onViewDetachFromWindow
但
onDetachedFromWindow的问题( )不一定会在这个 的情况下被调用。 ListView 儿童被回收和重新使用,并且尽可能ListView避免不必要的 onDetachedFromWindow()。
但是,当Activity被销毁时,应该为适配器创建的所有视图调用onDetachedFromWindow() ,或者当ListView从窗口分离时调用 。
所以你不能指望列表视图被破坏。
我爱downvote没有任何意见 2015-08-03 08:10:30
同样的问题。我尝试覆盖onDetachedFromWindow,但是当我向上和向下滚动时,它从来没有被调用过。 – jiashie 2014-10-21 01:47:09
我的意思是项目视图应该扩展android视图,而不是ListView。 – Borzh 2014-12-02 18:40:03
(downvoted)看到我的答案http://stackoverflow.com/a/31719879/1377145 – 2015-07-30 09:22:34