2010-09-28 51 views
8

當在android listview上覆蓋baseadapter時,您必須實現此方法public View getView(int position, View convertView, ViewGroup parent)。 convertview是滾動時先前從列表中移出的視圖,並且給出它以便您可以重新使用該視圖而不是創建新視圖。回收在一個列表視圖中的意見,值得嗎?

我的問題是,真的有必要重用視圖嗎?如果只有一部分數據發生變化,我可以理解它的重用。但是創造一個視圖的開銷真的很重要嗎?關於使用我所看到的列表視圖的每個教程都會告訴您要回收視圖,即使是像textview這樣的簡單視圖也是如此。

我想我的問題是爲什麼谷歌決定做這個getView方法的默認行爲?

+1

這不是困難的待辦事項和框架使它容易..所以是顯然值得的。 – Rorist 2010-09-29 00:29:10

回答

13

幾個原因回收的觀點:

  • 對象的創建是比較昂貴的。垃圾收集系統需要處理所創建的每個附加對象,並且至少會暫時增加內存佔用量。這對於更復雜的視圖更爲重要,但膨脹和佈置視圖對象可能很昂貴。大多數情況下,您只是對getView中的視圖進行微小更改,而不會影響佈局(例如設置文本),因此您可能可以避免佈局開銷。
  • 請記住,Android旨在運行在資源受限的環境中。
  • 最後,它已經爲你完成了,它證明不會傷害任何東西,所以爲什麼不使用它?
+0

至少有一個不這樣做的原因是如果你想在列表視圖中爲不同的行設置不同的佈局。如果您實際使用不同的佈局,則無法回收音樂會視圖。爲了能夠回收,您需要將各種可能的行視圖組合成一個超大視圖。是否比不回收小視圖更昂貴?我不知道。 – 2012-09-26 20:00:55

+8

@JeffreyBlattman錯了。 BaseAdapter支持getItemViewType(int position)和getViewTypeCount()的不同列表視圖項目。在getView()中提供了正確的視圖後,ListView將爲您處理正確的回收。 – 2012-10-05 13:46:55

+3

感謝您糾正我。 – 2012-10-05 15:32:54

7

有必要嗎?只有當您在Nexus One上甩動時才需要額外的30-40 fps。 :)(請參閱幻燈片http://code.google.com/events/io/2010/sessions/world-of-listview-android.html,幻燈片13-17)

爲什麼設備不工作,不需要忽略95%完成的重要優化?

+0

我想這是我的問題。究竟是重複使用視圖提供的開銷 – Falmarri 2010-09-29 18:28:25

+1

從XML膨脹是其中的一個重要部分。對象流失不太顯着,但可能導致在匆匆過程中出現明顯的GC暫停,尤其是在較舊的設備上。 – adamp 2010-09-29 22:10:31

相關問題