2015-09-02 25 views
2

我知道,當您使用ListViewArrayAdapter以及佈局資源時,應該使用視圖持有者模式重用convertView以提高滾動的平滑度。查看動態創建的ListView項目的持有者模式

如果動態生成ListView的項目,例如使用new RelativeLayout(context)並使用addView()添加內容,那麼怎麼辦?在這種情況下,我應該使用類似於視圖持有者模式的東西重新使用RelativeLayout?通過這個,我的意思是沿着這條線。

RelativeLayout relativeLayout = (RelativeLayout) convertView.getTag(); 
relativeLayout.removeAllViews(); 
// Now add all the required Views. 

使用視圖保持器圖案以避免初始化的RelatativeLayout新實例對齊或是用於使用視圖保持器圖案,以避免從一個充氣資源到findViewById所有呼叫的主要原因是什麼?

回答

2

我同意@ ivan-bartsov,並補充說,這兩種操作,即通貨膨脹和通過id查找視圖,都很昂貴,而ViewHolder模式的原因是要走的路。

我也想提到這一點。如果您的視圖組合數量有限,可以說1,2,3或甚至4,那麼覆蓋Adapter.getViewTypeCountAdapter.getItemViewType將是一個非常好的主意,因此您可以利用內置的ViewHolder/Recycling功能獲得不同的優勢項目佈局。該框架將適當地給你一個給定的位置適當的convertView。

最後要說明的是,有時數據的結構將會更有意義,因爲使用ExpandableListView或類似的小部件將爲子視圖提供開箱即用的回收視圖,因此您不需要不得不自己膨脹他們。

1

是的,你絕對應該仍然使用ViewHolder。手動視圖創建方案與膨脹時沒有多大區別。

使用視圖保持器圖案以避免初始化RelatativeLayout的新實例 對齊或是使用 視圖保持器圖案,以避免從一個 充氣資源到findViewById所有呼叫的主要原因是什麼?

其實,你避免RelativeLayout(或其他)冗餘實例通過檢查getView(int position, View convertView, ViewGroup parent)convertView參數null,當手動創建的視圖,你也應該這樣做。

你仍然需要一種方式來訪問你的子視圖(TextView S或你有什麼),所以你要麼使用手動虛構的ID或標籤進行搜索或者通過使用ViewHolder來存儲對象引用(這是當然,更快)