2013-03-07 58 views
3

我有一個帶有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)但它似乎在視圖回收時調用。

謝謝!

回答

2

你的項目視圖必須擴展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://stackoverflow.com/a/31719879/1377145 – 2015-07-30 09:22:34

2

this offical issue,有一個與onViewDetachFromWindow

onDetachedFromWindow的問題( )不一定會在這個 的情況下被調用。 ListView 兒童被回收和重新使用,並且儘可能ListView避免不必要的 onDetachedFromWindow()。
但是,當Activity被銷燬時,應該爲適配器創建的所有視圖調用onDetachedFromWindow() ,或者當ListView從窗口分離時調用 。

所以你不能指望列表視圖被破壞。

+5

我愛downvote沒有任何意見<3 – 2015-08-03 08:10:30

相關問題