适配器上的检测项目视图已被破坏

问题描述:

我有一个带有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); 
+0

同样的问题。我尝试覆盖onDetachedFromWindow,但是当我向上和向下滚动时,它从来没有被调用过。 – jiashie 2014-10-21 01:47:09

+0

我的意思是项目视图应该扩展android视图,而不是ListView。 – Borzh 2014-12-02 18:40:03

+0

(downvoted)看到我的答案http://*.com/a/31719879/1377145 – 2015-07-30 09:22:34

this offical issue,有一个与onViewDetachFromWindow

onDetachedFromWindow的问题( )不一定会在这个 的情况下被调用。 ListView 儿童被回收和重新使用,并且尽可能ListView避免不必要的 onDetachedFromWindow()。
但是,当Activity被销毁时,应该为适配器创建的所有视图调用onDetachedFromWindow() ,或者当ListView从窗口分离时调用 。

所以你不能指望列表视图被破坏。

+5

我爱downvote没有任何意见 2015-08-03 08:10:30