2017-05-18 48 views
0
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
if (convertView == null){ 
    convertView = ContactViewActivity.this.getLayoutInflater().inflate(R.layout.contact_view_field_row, 
    parent, false); 
} 

String value = (String)getItem(position); 

TextView fieldValue = (TextView)convertView.findViewById(R.id.contact_view_row_value); 
fieldValue.setText(value); 

return convertView; 
} 

上述代碼取自BaseAdapter類。那麼爲convertView設置充氣視圖有什麼意義呢? getView的全部要點是如果沒有一個,給它一個屬性,然後返回它,這樣它可以顯示在應用程序中的ListView權利?那麼爲什麼不直接說findViewById(R.id.contact_view_row_value);?我的意思是我們真的在用layoutInflater做什麼?我認爲,因爲我們將它設置爲等於convertView,所以不需要鍵入convertView.findViewById。我的意思是它已經等於膨脹的XML文件了嗎?我很困惑,我真的很感激一些澄清。Android Studio;膨脹並將視圖保存到convertView中有什麼意義?

回答

1

因爲convertView是可以重複使用的東西,儘管在運行時您不知道您是否提供了必須更新數據的現有View,或者是否需要更新新的View

應用程序啓動時,你需要inflateViews,以便在您ListView在所有顯示的任何數據。 膨脹意味着將資源XML解析爲一個圖形對象,併爲其提供Android Context,因此它成爲可以在圖形層次結構上呈現和交互的潛力。稍後在應用程序中,Android會嘗試幫助您節省資源並避免不必要的通貨膨脹,方法是向您傳遞先前已被誇大的View;這就是爲什麼我們檢查convertView是否不等於null。如果不是,您可以將轉換爲,將現有的View轉換爲顯示與當前索引相關的數據的內容。

但是,值得注意的是ListView已被棄用。相反,嘗試使用RecyclerView,這種行爲更加明顯。這是一個example

+0

哦,好的,謝謝,它現在非常有意義! –

+0

其實還有一件事,有什麼說'convertview.findViewById();'而不是隻是說'findViewById();'? –

+0

@StephenKandeh你縮小搜索範圍;而不是讓父'View'搜索它的所有內容,包括'convertView',它包含你正在尋找的'View',你可以立即縮小到'convertView',如果你知道它在那裏! –